先把一般使用时候用到的几个串口库函数列出来。
以下是串口初始化的一个参考函数:
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)
串口是有很多中断源的,传入参数UASRT_IT_RXNE,就是判断接收是不是产生了中断,这个函数做的就是对串口控制寄存器CR1,CR2,CR3某些位,结合SR寄存器,做出的判断。
但是CR寄存器是在哪里赋值的呢?
时间: 2024-11-03 03:25:05