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

STM32串口寄存器操作

时间:11-09 来源:互联网 点击:
//USART.C

/*********************************************************************************************************//* USART 收发  *//* 陈鹏 20110611*/#include "SYSTEM.H"#include "GPIO_INIT.H"#include "USART.H"//定义串口通道号最大值#define UART_ChMax 1//UART外设结构指针static const  USART_TypeDef * USARTxN[5] = {USART1,USART2,USART3,UART4,UART5};//相关UART状态结构typedef struct{  FlagStatus  NewDataFlag;//接收到新数据  FlagStatus  BuffFull; //接收Buff满  FlagStatus  IntRx; //是否开启中断接收  u8 *RxBuff;//接收Buff指针  u16 RxBuffSize;//接收缓冲区大小,一帧数据大小  u16 UartRxCnt;//接收数据计数器} UartRx_TypeDef;//UART1 接收状态结构static UartRx_TypeDef UartRx[UART_ChMax + 1];////////////////////////////////////////////////////////////////////加入以下代码,支持printf函数,而不需要选择use MicroLIB  #if 1#pragma import(__use_no_semihosting)             //标准库需要的支持函数                 struct __FILE {   int handle;   /* Whatever you require 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 时钟使能Device

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

网站地图

Top