微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32串口寄存器操作

STM32串口寄存器操作

时间:11-09 来源:互联网 点击:

ire here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; /* FILE is typedef’ d in stdio.h. */ FILE __stdout; //定义_sys_exit()以避免使用半主机模式 _sys_exit(int x) { x = x; } //重定义fputc函数 int fputc(int ch, FILE *f){ UARTx_SendByte(0,(u8)ch); return ch;}#endif //end///////////////////////////////////////////////////////////////////************************************************************************************************************************** 函数 : u8 UARTx_Init(u8 ch,u8 SYS_CLK,u32 Speed,u8 RX_Int)* 功能 : 串口初始化* 参数 : ch:通道选择,0->usart1;SYS_CLK当前系统时钟,Speed:串口速度,RX_Int:是否时能中断接受* 返回 : 0:成功,1:失败* 依赖 : 底层宏定义* 作者 : 陈鹏* 时间 : 20120403* 最后修改时间 : 20120403* 说明 : USART1~UART5,对应通道0~4*************************************************************************************************************************/u8 UARTx_Init(u8 ch,u8 SYS_CLK,u32 Speed,u8 RX_Int){USART_TypeDef *UARTx = (USART_TypeDef *)USARTxN[ch]; //获取对应通道硬件基址指针u32 clock;u8 irq_n;float fclk;if(ch > UART_ChMax)return 1; //端口号超出范围//初始化UART IODeviceClockEnable(DEV_AFIO,ENABLE);//复用功能AFIO时钟使能switch (ch){case 0: //通道0,USART1 ,TX:PA9;RX:PA10{DeviceClockEnable(DEV_GPIOA,ENABLE);//GPIO A 时钟使能DeviceClockEnable(DEV_USART1,ENABLE);//USART 1 时钟使能GPIOx_Init(GPIOA,BIT9,AF_PP, SPEED_10M); //PA09,TXD只能设置成复用推挽输出GPIOx_Init(GPIOA,BIT10,IN_FLOATING,IN_IN); //浮空输入DeviceReset(DEV_USART1);//复位串口1irq_n = IRQ_USART1;//串口1中断号}break;case 1: //通道1,USART2 ,TX:PA2;RX:PA3{ DeviceClockEnable(DEV_GPIOA,ENABLE);//GPIO A 时钟使能DeviceClockEnable(DEV_USART2,ENABLE);//USART 2 时钟使能GPIOx_Init(GPIOA,BIT2,AF_PP, SPEED_10M); //PA2,TXD只能设置成复用推挽输出GPIOx_Init(GPIOA,BIT3,IN_FLOATING,IN_IN); //浮空输入DeviceReset(DEV_USART2);//复位串口2irq_n = IRQ_USART2;//串口2中断号}break;case 2: //通道2,USART3 ,TX:PD8;RX:PD9{DeviceClockEnable(DEV_GPIOD,ENABLE);//GPIO D 时钟使能DeviceClockEnable(DEV_USART3,ENABLE);//USART 3 时钟使能GPIOx_Init(GPIOD,BIT8,AF_PP, SPEED_10M); //PD8,TXD只能设置成复用推挽输出GPIOx_Init(GPIOD,BIT9,IN_FLOATING,IN_IN); //浮空输入DeviceReset(DEV_USART3);//复位串口3irq_n = IRQ_USART3;//串口3中断号}break;case 3: //通道3,UART4 ,TX:PC10;RX:PC11{DeviceClockEnable(DEV_GPIOC,ENABLE);//GPIO C 时钟使能DeviceClockEnable(DEV_UART4,ENABLE);//UART 4 时钟使能GPIOx_Init(GPIOC,BIT10,AF_PP, SPEED_10M); //PC10,TXD只能设置成复用推挽输出GPIOx_Init(GPIOD,BIT11,IN_FLOATING,IN_IN); //浮空输入DeviceReset(DEV_UART4);//复位串口3irq_n = IRQ_UART4;//串口3中断号}break;case 4: //通道4,UART5 ,TX:PC12;RX:PD2{DeviceClockEnable(DEV_GPIOC,ENABLE);//GPIO C 时钟使能DeviceClockEnable(DEV_GPIOD,ENABLE);//GPIO D 时钟使能DeviceClockEnable(DEV_UART5,ENABLE);//UART 5 时钟使能GPIOx_Init(GPIOC,BIT12,AF_PP, SPEED_10M); //PC12,TXD只能设置成复用推挽输出GPIOx_Init(GPIOD,BIT2,IN_FLOATING,IN_IN); //浮空输入DeviceReset(DEV_UART5);//复位串口3irq_n = IRQ_UART5;//串口3中断号}break;default : return 1;//端口号超出范围,返回错误}//设置波特率分频系数clock = SYS_CLK * 1;//USART1时钟if(ch > 0)clock /= 2; //USART2,3,4,5时钟fclk = (float)clock / 16.0 / Speed;//计算波特率分频系数clock = (u16)fclk;//得到波特率分频系数整数部分UARTx->BRR = clock < 4;//设置波特率整数部分  fclk -= clock;//得到波特率分频系数小数部分  fclk *= 16;  UARTx->BRR = 0xf & (u16)fclk;//设置波特率小数部分  //配置UART  UARTx->CR1 = 0x2;//使能USART,1个开始位,8位数据  UARTx->CR1 = 0x8;//置TE = 1;发送使能;发送第一个空闲位  UARTx->CR1 = 0x04;//RE = 1;接收使能  SetUartRxBuff(ch,0,NULL);//设置串口接收缓冲区  UARTx_ClearRxInt(ch); //清除串口接收中断标志  if(RX_Int)  {    UARTx->CR1 = 0x20;//RXNEIE = 1,开RXNE中断,即开启接收中断    NVIC_IntEnable(irq_n,1);//开启USART1全局中断    UartRx[ch].IntRx = SET;//中断接收标志有效  }   else  {    NVIC_IntEnable(irq_n,0);     //关闭USART全局中断    UartRx[ch].IntRx = RESET;//中断接收标志无效  }  UARTx_SendByte(0,S);//发送一字节数据}/************************************************************************************************************************** 函数 : u8 UARTx_Config(u8 ch,UART_Config_TypeDef * cfg)* 功能 : 串口配置* 参数 : ch:通道选择,0->usart1;cfg:串口配置结构指针* 返回 : 0:成功,非0:失败* 依赖 : 底层宏定义* 作者 : 陈鹏* 时间 : 20120408* 最后修改时间 : 20120408* 说明 : USART1~UART5,对应通道0~4 ,返回1:校验设置错误,2:停止位设置错误,3:通道超出范围*************************************************************************************************************************/u8 UARTx_Config(u8 ch,UART_Config_TypeDef * cfg){USART_TypeDef *UARTx = (USART_TypeDef *)USARTxN[ch]; //获取对应通道硬件基址指针if(ch > UART_ChMax)//判断端口是否超出范围return 3;UARTx_PowerDown(ch);//进入掉电模式,进行配置switch (cfg->OddEvenVerify)//设置校验位{case UART_VERIFY_NULL://无校验{UARTx->CR1 &= ~BIT12;//一个起始位,8个数据位UARTx->CR1 &= ~BIT10;//禁止校验控制}break;case UART_ODD://奇校验{UARTx->CR1 = BIT12;//一个起始位,9个数据位UARTx->CR1 = BIT10;//使能校验控制UARTx->CR1 = BIT9;//奇校验}break;case UART_EVEN://偶校验{UARTx->CR1 = BIT12;//一个起始位,9个数据位UARTx->CR1 = BIT10;//使能校验控制UARTx->CR1 &= ~BIT9;//偶校验}break;default : {UARTx_PowerOn(ch);//串口重新上电return 1; //设置错误,返回校验设置错误1}}if(cfg->StopBitWidth == UART_STOP_1BIT) //设置停止位{UARTx->CR2 &= ~(0x3 < 12);//清除设置,默认一个停止位}else if(cfg->StopBitWidth == UART_STOP_2BIT){UARTx->CR2 &= ~(0x3 < 12);UARTx->CR2 = (0x2 < 12);//2个停止位} else{UARTx_PowerOn(ch);//串口重新上电return 2; //停止位设置错误,返回错误2}UARTx_PowerOn(ch);//串口重新上电return 0; //设置完成,返回0}/************************************************************************************************************************** 函数 : void UARTx_SendByte(u8 ch,u8 data)* 功能 : UART单字节发送* 参数 : ch:通道号,dataL:要发送的数据* 返回 : 无* 依赖 : 底层宏定义* 作者 : 陈鹏* 时间 : 20120403* 最后修改时间 : 20120403* 说明 : 通道号为0 - 4;*************************************************************************************************************************/void UARTx_SendByte(u8 ch,u8 data){USART_TypeDef *UARTx = (USART_TypeDef *)USARTxN[ch]; //获取对应通道硬件基址指针if(ch > UART_ChMax)//判断端口是否超出范围return;while(!(UARTx->SR & 0x80));//等待发送寄存器为空,(否则连续发送时数据易丢失 )UARTx->DR = data;//发送数据while(!(UARTx->SR & 0x40));//等待TC = 1;也就是发送完成UARTx->SR &= ~(1 < 6);//清除发送完成标志}/************************************************************************************************************************** 函数 : void UARTx_TX(u8 ch,u8 *tx_buff,u16 byte_number)* 功能 : UART数据发送函数* 参数 : ch:通道号,tx_buff:发送缓冲区,byte_number:需要发送的字节* 返回 : 无* 依赖 : void UART_SendByte(u8 ch,u8 data)* 作者 : 陈鹏* 时间 : 20120403* 最后修改时间 : 20120403* 说明 : 非DMA方式,非FIFO方式发送*************************************************************************************************************************/void UARTx_TX(u8 ch,u8 *tx_buff,u16 byte_number){u8 i;if(ch > UART_ChMax)//判断端口是否超出范围return;for(i = 0;i < byte_number;i++)//循环发送,直至发送完毕{UARTx_SendByte(ch,tx_buff[i]);}}/************************************************************************************************************************** 函数 : void UARTx_PowerDown(u8 ch)* 功能 : UART掉电* 参数 : ch:通道选择* 返回 : 无* 依赖 : 底层宏定义* 作者 : 陈鹏* 时间 : 20120403* 最后修改时间 : 20120403* 说明 : 进入

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top