串口配置过程 1,配置IO
// 设置Tx引脚为推拉输出模式,推拉式输出级既提高电路的负载能力,又提高开关速度 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure);
// 设置Rx引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure);
2,配置UART
void USART3_Configuration(void) {
USART_InitTypeDef USART_InitStructure;
//所用设备的波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; /*数据长度=8位*/ USART_InitStructure.USART_StopBits = USART_StopBits_1; /*一个停止位*/ USART_InitStructure.USART_Parity = USART_Parity_No; /*无奇偶校验*/
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; /*非硬件流控制*/
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; /*允许接收和发送*/ //若只是接受则只要USART_Mode_Rx就可以
USART_Init(USART3, &USART_InitStructure);
/*开始时发送中断不开*/
// USART_ITConfig(USART3, USART_IT_TXE, ENABLE);
USART_ITConfig(USART3,USART_IT_CTS, DISABLE);//这个明白是什么意思?
- USART_IT_CTS: CTS 改变中断 (对于UART4和UART5无法使用) * - USART_IT_LBD: LIN 间隔侦测中断 * - USART_IT_TXE: 发送寄存器空中断 * - USART_IT_TC: 发送完成中断 * - USART_IT_RXNE: 接收寄存器全满中断 * - USART_IT_IDLE: IDLE线性中断 * - USART_IT_PE: 奇偶错误中断
* - USART_IT_ERR: 错误中断(桢错误, 噪声错误, 超速错误) 可以看一下汉化固件库
USART_InitStructure.USART_BaudRate = 115200; //设置波特率 速度越快,传输时间越短,要注意
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); /*使能串口*/
USART_Cmd(USART3, ENABLE); //使能串口 }
3, 打开串口时钟
void RCC_Configuration(void) // 启动USART1的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //注意各串口所对应的时钟源不 //一样; Uart1 用的是APB2 Uart2 用的是APB1 Uart3 用的是APB1
4,配置NVIC
在void NVIC_Configuration(void) 中使能串口中断,同时要设置中断的优先级。优先级设置时候要保证不能重复
/* 使能 USART1 中断 */
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; //此处的数字不能重复,需要中断优先级 //高的应设置数字小一点 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能串口中断 NVIC_Init(&NVIC_InitStructure);
5,在中断向量表app_vetc_v5 .c 中加入串口中断
在中断向量表中加入
USART1_IRQHandler, // 直接进入方式;
6,在 中断函数中USART1_IRQHandler, 写入中断函数
/******************************************************************************* * Function Name : USART3_IRQHandler
* Description : This function handles USART3 global interrupt request. * Input : None * Output : None * Return : None
*******************************************************************************/ void USART3_IRQHandler(void) {
StackSave(); //保存系统临界环境; OS_CPU_SR cpu_sr; CPU_CRITICAL_ENTER(); OSIntNesting++;
CPU_CRITICAL_EXIT();
unsigned char k=0,buf1=0;
if (USART_GetITStatus(USART3,USART_IT_RXNE)) { (2)USART_IT:指明要检测的USART中断源.
* 这个参数可以是下面的值之一 :
* - USART_IT_CTS: CTS 改变中断 (对于UART4和UART5无法使用) * - USART_IT_LBD: LIN 间隔侦测中断 * - USART_IT_TXE: 发送寄存器空中断 * - USART_IT_TC: 发送完成中断 * - USART_IT_RXNE: 接收寄存器全满中断 * - USART_IT_IDLE: IDLE线性中断 * - USART_IT_ORE: 超速错误中断 * - USART_IT_NE: 噪声错误中断 * - USART_IT_FE: 桢错误中断 * - USART_IT_PE: 奇偶错误中断
buf1 = USART_ReceiveData(USART3); //当连续发送多个数时BUF1 中只存了最后一个命令
USART_ClearITPendingBit(USART3,USART_FLAG_TC);
* 功能描述: 清除USARTx中断挂起位
* 输入参数: (1)USARTx: 选择 USART 或者 UART的外围设备. * 这个参数可以是下面的值之一 :
* - USART1, USART2, USART3, UART4 or UART5. * (2)USART_IT:指明要被清除的中断挂起位. * 这个参数可以是下面的值之一:
* - USART_IT_CTS: CTS 改变中断 (对于UART4和UART5无法使用) * - USART_IT_LBD: LIN 间隔侦测中断 * - USART_IT_TC: 发送完成中断. * - USART_IT_RXNE: 接收寄存器全满中断. * * Notes:
* - PE (奇偶校验错误), FE (桢错误), NE (噪声错误), * ORE (过速错误) 和 IDLE (找到空闲线)挂起位 * 被软件按顺序清除: 一个读USART_SR寄存器操作 (USART_GetFlagStatus())
* 接着一个读USART_DR寄存器操作(USART_ReceiveData()).
* - RXNE挂起位也可以被一个读USART_DR寄存器操作清除 (USART_ReceiveData()).
* - TC挂起位也可以被软件按顺序清除: 一个读USART_SR寄存器操作 (USART_GetFlagStatus())
* - TXE挂起位置可以被一个写USART_DR寄存器清除 (USART_SendData()).
USART_ClearFlag(USART3,USART_FLAG_TC);//清除中断标志 * 接着一个读USART_DR寄存器操作(USART_ReceiveData()).
OSIntExit(); StackRestore(); }
//系统中断退出 //恢复 系统临界环境;