l 串口时钟使能,GPIO时钟使能:
RCC_APB2PeriphClockCmd();
l 串口复位:
USART_DeInit(); 这一步不是必须的
l GPIO端口模式设置:
GPIO_Init();
l 串口参数初始化:
USART_Init();
l 开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)
NVIC_Init();
USART_ITConfig();
l 使能串口:
USART_Cmd();
l 编写中断处理函数:
USARTx_IRQHandler();
l 串口数据收发:
void USART_SendData();//发送数据到串口,DR
uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据
l 串口传输状态获取:
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);
l 源代码:
1 #pragma import(__use_no_semihosting) 2 struct __FILE 3 { 4 int handle; 5 }; 6 7 FILE __stdout; 8 void _sys_exit(int x) 9 { 10 x = x; 11 } 12 int fputc(int ch, FILE *f) 13 { 14 while((USART1->SR&0X40)==0); 15 USART1->DR = (u8) ch; 16 return ch; 17 } 18 19 void uart_init(u32 bound){ 20 //GPIO¶Ë¿ÚÉèÖà 21 GPIO_InitTypeDef GPIO_InitStructure; 22 USART_InitTypeDef USART_InitStructure; 23 NVIC_InitTypeDef NVIC_InitStructure; 24 25 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //ʹÄÜUSART1£¬GPIOAʱÖÓ 26 27 //USART1_TX GPIOA.9 28 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9 29 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 30 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍìÊä³ö 31 GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯GPIOA.9 32 33 //USART1_RX GPIOA.10³õʼ»¯ 34 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10 35 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿ÕÊäÈë 36 GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯GPIOA.10 37 38 //Usart1 NVIC ÅäÖà 39 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; 40 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//ÇÀÕ¼ÓÅÏȼ¶3 41 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //×ÓÓÅÏȼ¶3 42 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀʹÄÜ 43 NVIC_Init(&NVIC_InitStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷ 44 45 //USART ³õʼ»¯ÉèÖà 46 USART_InitStructure.USART_BaudRate = bound;//´®¿Ú²¨ÌØÂÊ 47 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ 48 USART_InitStructure.USART_StopBits = USART_StopBits_1;//Ò»¸öֹͣλ 49 USART_InitStructure.USART_Parity = USART_Parity_No;//ÎÞÆæżУÑéλ 50 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎÞÓ²¼þÊý¾ÝÁ÷¿ØÖÆ 51 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //ÊÕ·¢Ä£Ê½ 52 53 USART_Init(USART1, &USART_InitStructure); //³õʼ»¯´®¿Ú1 54 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//¿ªÆô´®¿Ú½ÓÊÜÖÐ¶Ï 55 USART_Cmd(USART1, ENABLE); //ʹÄÜ´®¿Ú1 56 57 } 58 59 void USART1_IRQHandler(void) //´®¿Ú1ÖжϷþÎñ³ÌÐò 60 { 61 u8 Res; 62 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //½ÓÊÕÖжÏ(½ÓÊÕµ½µÄÊý¾Ý±ØÐëÊÇ0x0d 0x0a½áβ) 63 { 64 Res =USART_ReceiveData(USART1); //¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý 65 66 if((USART_RX_STA&0x8000)==0)//½ÓÊÕδÍê³É 67 { 68 if(USART_RX_STA&0x4000)//½ÓÊÕµ½ÁË0x0d 69 { 70 if(Res!=0x0a)USART_RX_STA=0;//½ÓÊÕ´íÎó,ÖØпªÊ¼ 71 else USART_RX_STA|=0x8000; //½ÓÊÕÍê³ÉÁË 72 } 73 else //»¹Ã»ÊÕµ½0X0D 74 { 75 if(Res==0x0d)USART_RX_STA|=0x4000; 76 else 77 { 78 USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; 79 USART_RX_STA++; 80 if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//½ÓÊÕÊý¾Ý´íÎó,ÖØпªÊ¼½ÓÊÕ 81 } 82 } 83 } 84 }
作者:长风
Email:844064492@qq.com
QQ群:607717453
Git:https://github.com/zhaohu19910409Dz
开源项目:https://github.com/OriginMEK/MEK
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
感谢您的阅读。如果觉得有用的就请各位大神高抬贵手“推荐一下”吧!你的精神支持是博主强大的写作动力。
如果觉得我的博客有意思,欢迎点击首页左上角的“+加关注”按钮关注我!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步