串口的各种函数,其实都是围绕对CR1到CR3这几个寄存器进行配置,串口有很多功能,都没用到,这里先列一些平时会用到的函数。
以下是串口初始化的一个参考函数:
void uart_init(u32 bound){ GPIO_InitTypeDef GPIO_InitStructure; //对GPIO进行配置 USART_InitTypeDef USART_InitStructure; //对串口进行配置 NVIC_InitTypeDef NVIC_InitStructure; //对串口中断进行配置 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能串口时钟 GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //配置GPIO的AF功能 GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //配置GPIO的AF功能 //GPIO初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;// 配置成AF模式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // GPIO_Init(GPIOA,&GPIO_InitStructure); //调用GPIO初始化函数 //USART1 初始化 USART_InitStructure.USART_BaudRate = bound;//设置波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//设置有效数据长度 USART_InitStructure.USART_StopBits = USART_StopBits_1;//1位停止位 USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//没有流控 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式 USART_Init(USART1, &USART_InitStructure); //调用串口初始化函数 USART_Cmd(USART1, ENABLE); //使能串口1 USART_ClearFlag(USART1, USART_FLAG_TC); #if EN_USART1_RX USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//使能串口中断 //USART_IT_RXNE: Receive Data register not empty interrupt
//Usart1 NVIC 中断配置 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;// 要配置的是串口1的中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //响应优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //中断使能 NVIC_Init(&NVIC_InitStructure); //调用中断初始化函数 #endif }
定义串口中断函数:void USART1_IRQHandler(void) 。这个函数的名字不是随便取的,在startup_stm32f40_41xxx.s中有定义:
DCD USART1_IRQHandler ; USART1
如果串口发生了中断,就会跳到这个函数,这个函数的处理是要用户自己定义的。
另外用到的几个函数:
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT) //调用方法例如: if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //发生了RXNE中断
串口是有很多中断源的,传入参数UASRT_IT_RXNE,就是判断接收是不是产生了这个类型的中断,这个函数做的就是对串口控制寄存器CR1,CR2,CR3某些位,结合SR寄存器,做出的判断。但是CR寄存器是在哪里赋值的呢?
其余函数介绍:
1/ void USART_DeInit(USART_TypeDef* USARTx)
操作RCC_APB2RSTR寄存器,对串口进行复位。
void USART_DeInit(USART_TypeDef* USARTx) { /* Check the parameters */ assert_param(IS_USART_ALL_PERIPH(USARTx)); if (USARTx == USART1) { RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE); // 操作RCC_APB2RSTR寄存器,对串口进行复位,
RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE); } else if (USARTx == USART2) { RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, DISABLE); } else if (USARTx == USART3) { RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, DISABLE); } else if (USARTx == UART4) { RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, DISABLE); } else if (USARTx == UART5) { RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, DISABLE); } else if (USARTx == USART6) { RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART6, ENABLE); RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART6, DISABLE); } else if (USARTx == UART7) { RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART7, ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART7, DISABLE); } else { if (USARTx == UART8) { RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART8, ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART8, DISABLE); } } }
2、void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
这个太长了,不摘录了,就是根据传入的串口配置参数,比如数据长,奇偶校验等,配置串口控制寄存器和波特率寄存器
3、void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState)
串口使能控制
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState) { /* Check the parameters */ assert_param(IS_USART_ALL_PERIPH(USARTx)); assert_param(IS_FUNCTIONAL_STATE(NewState)); if (NewState != DISABLE) { /* Enable the selected USART by setting the UE bit in the CR1 register */ USARTx->CR1 |= USART_CR1_UE; } else { /* Disable the selected USART by clearing the UE bit in the CR1 register */ USARTx->CR1 &= (uint16_t)~((uint16_t)USART_CR1_UE); } }