[MM32软件] MM32串口配置代码分享

[复制链接]
 楼主| piteqiu 发表于 2020-2-24 22:56 | 显示全部楼层 |阅读模式
串口1的配置
  1. #include "uart_nvic.h"


  2. //串口1中断服务程序
  3. u8 UART_RX_BUF[UART_REC_LEN];     //接收缓冲,最大UART_REC_LEN个字节.
  4. //接收状态
  5. //bit15,        接收完成标志
  6. //bit14,        接收到0x0d
  7. //bit13~0,        接收到的有效字节数目
  8. u16 UART_RX_STA=0;       //接收状态标记          

  9. void uart_nvic_init(u32 bound){
  10.     //GPIO端口设置
  11.     GPIO_InitTypeDef GPIO_InitStructure;
  12.     UART_InitTypeDef UART_InitStructure;
  13.     NVIC_InitTypeDef NVIC_InitStructure;
  14.    
  15.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_UART1, ENABLE);        //使能UART1
  16.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);  //开启GPIOA时钟
  17.    
  18.     //UART1 NVIC 配置
  19.     NVIC_InitStructure.NVIC_IRQChannel = UART1_IRQn;
  20.     NVIC_InitStructure.NVIC_IRQChannelPriority = 3;                //子优先级3
  21.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
  22.     NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
  23.    
  24.     //UART 初始化设置
  25.     GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);
  26.     GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);
  27.    
  28.     UART_InitStructure.UART_BaudRate = bound;//串口波特率
  29.     UART_InitStructure.UART_WordLength = UART_WordLength_8b;//字长为8位数据格式
  30.     UART_InitStructure.UART_StopBits = UART_StopBits_1;//一个停止位
  31.     UART_InitStructure.UART_Parity = UART_Parity_No;//无奇偶校验位
  32.     UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;//无硬件数据流控制
  33.     UART_InitStructure.UART_Mode = UART_Mode_Rx | UART_Mode_Tx;        //收发模式
  34.    
  35.     UART_Init(UART1, &UART_InitStructure); //初始化串口1
  36.     UART_ITConfig(UART1, UART_IT_RXIEN, ENABLE);//开启串口接受中断
  37.     UART_Cmd(UART1, ENABLE);                    //使能串口1
  38.    
  39.     //UART1_TX   GPIOA.9
  40.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  41.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  42.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
  43.     GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
  44.    
  45.     //UART1_RX          GPIOA.10初始化
  46.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  47.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  48.     GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  
  49.    
  50. }

  51. void UART1_IRQHandler(void)                        //串口1中断服务程序
  52. {
  53.     u8 Res;
  54.     if(UART_GetITStatus(UART1, UART_IT_RXIEN)  != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  55.     {
  56.         UART_ClearITPendingBit(UART1,UART_IT_RXIEN);
  57.         Res =UART_ReceiveData(UART1);        //读取接收到的数据
  58.         if((Res==0x0d)&&((UART_RX_STA&0X3FFF)>0))
  59.         {
  60.             UART_RX_STA|=0x4000;
  61.             UART_RX_BUF[UART_RX_STA&0X3FFF]=Res ;
  62.             UART_RX_STA++;
  63.         }
  64.         else if((UART_RX_STA&0x4000)&&((UART_RX_STA&0X3FFF)>0))//接收到了0x0d
  65.         {
  66.             if(Res==0x0a)
  67.             {
  68.                 UART_RX_STA|=0x8000;                               
  69.             }
  70.             UART_RX_BUF[UART_RX_STA&0X3FFF]=Res ;
  71.             UART_RX_STA++;
  72.         }
  73.         else{
  74.             UART_RX_BUF[UART_RX_STA&0X3FFF]=Res ;
  75.             UART_RX_STA++;
  76.             UART_RX_STA=UART_RX_STA&0X3FFF;
  77.             if((UART_RX_STA)>(UART_REC_LEN-1))
  78.                 UART_RX_STA=0;//接收数据错误,重新开始接收       
  79.         }
  80.     }
  81. }


 楼主| piteqiu 发表于 2020-2-24 22:57 | 显示全部楼层
串口2的配置
  1. void uart_initwBaudRate(u32 bound){
  2.     //GPIO端口设置
  3.     GPIO_InitTypeDef GPIO_InitStructure;
  4.     UART_InitTypeDef UART_InitStructure;
  5.    
  6.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART2, ENABLE);        //使能UART1,GPIOA时钟
  7.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);  //开启GPIOA,GPIOB时钟
  8.     //UART 初始化设置
  9.     GPIO_PinAFConfig(GPIOA,GPIO_PinSource14,GPIO_AF_1);
  10.     GPIO_PinAFConfig(GPIOA,GPIO_PinSource15,GPIO_AF_1);
  11.    
  12.     UART_InitStructure.UART_BaudRate = bound;//串口波特率
  13.     UART_InitStructure.UART_WordLength = UART_WordLength_8b;//字长为8位数据格式
  14.     UART_InitStructure.UART_StopBits = UART_StopBits_1;//一个停止位
  15.     UART_InitStructure.UART_Parity = UART_Parity_No;//无奇偶校验位
  16.     UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;//无硬件数据流控制
  17.     UART_InitStructure.UART_Mode = UART_Mode_Rx | UART_Mode_Tx;        //收发模式
  18.    
  19.     UART_Init(UART2, &UART_InitStructure); //初始化串口1
  20.     UART_Cmd(UART2, ENABLE);                    //使能串口1
  21.    
  22.     //UART1_TX   GPIOA.9
  23.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; //PA.9
  24.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  25.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
  26.     GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
  27.    
  28.     //UART1_RX          GPIOA.10初始化
  29.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;//PA10
  30.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  31.     GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  
  32.    
  33. }
 楼主| piteqiu 发表于 2020-2-24 22:58 | 显示全部楼层
重定义函数:
  1. int fputc(int ch, FILE *f)
  2. {      
  3.     while((UART2->CSR&UART_IT_TXIEN)==0);//循环发送,直到发送完毕   
  4.     UART2->TDR = (ch & (uint16_t)0x00FF);      
  5.     return ch;
  6. }
zhamatu 发表于 2020-2-26 15:21 | 显示全部楼层
支持下,谢谢分享!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

292

帖子

0

粉丝
快速回复 返回顶部 返回列表