你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F0 UART 收发程序

[复制链接]
STMCU小助手 发布时间:2021-11-22 21:03
1. 为了能够支持printf函数
定义如下
  1. #ifdef __GNUC__
  2.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
  3.      set to 'Yes') calls __io_putchar() */
  4.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  5. #else
  6.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  7. #endif /* __GNUC__ */
复制代码


2. UART IO及设置 初始化
  1. void USART1_Configuration(uint32_t iBaudRate)//´®¿Ú³õʼ»¯º¯Êý
  2. {  

  3.         GPIO_InitTypeDef  GPIO_InitStructure;
  4.         USART_InitTypeDef USART_InitStructure;

  5.         RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE);
  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE );

  7.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_1);
  8.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_1);        
  9.         /*
  10.         *  USART1_TX -> PA2 , USART1_RX -> PA3
  11.         */                                
  12.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;                 
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  14.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  15.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  16.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  17.         GPIO_Init(GPIOA, &GPIO_InitStructure);        

  18.         USART_InitStructure.USART_BaudRate = iBaudRate;//115200;//ÉèÖô®¿Ú²¨ÌØÂÊ
  19.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;//ÉèÖÃÊý¾Ýλ
  20.         USART_InitStructure.USART_StopBits = USART_StopBits_1;//ÉèÖÃֹͣλ
  21.         USART_InitStructure.USART_Parity = USART_Parity_No;//ÉèÖÃЧÑéλ
  22.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÉèÖÃÁ÷¿ØÖÆ
  23.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//ÉèÖù¤×÷ģʽ
  24.         USART_Init(USART1, &USART_InitStructure); //ÅäÖÃÈë½á¹¹Ìå

  25.         USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
  26.         USART_Cmd(USART1, ENABLE);//ʹÄÜ´®¿Ú1

  27. }        
复制代码

3. 设置UART接收中断
  1. void USART1_INT_Config(void)
  2. {
  3.    NVIC_InitTypeDef NVIC_InitStructure;

  4.   /* UART1 clock enable */
  5. //  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  6.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE );

  7.   /*  UART1 ÖжÏǶÌ×Éè¼Æ*/
  8.   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  9.   NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
  10.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  11.   NVIC_Init(&NVIC_InitStructure);   
  12. }
复制代码

4.  发送一个字节
  1. void UART1_SendByte(uint8_t byte) //·¢ËÍ1×Ö½ÚÊý¾Ý
  2. {
  3. //        RS485_C_HI;
  4.         while(!((USART1->ISR)&(1<<7)));
  5.         USART1->TDR=byte;   
  6. //        RS485_C_LW;
  7. }        

  8. 5. 发送BUFFER

  9. void UART1_SendData(uint8_t *Buffer, uint32_t Length)
  10. {
  11. //    RS485_C_HI;   
  12.     while(Length != 0)
  13.     {
  14.         while(!((USART1->ISR)&(1<<7)));//µÈ´ý·¢ËÍÍê
  15.         USART1->TDR= *Buffer;
  16.         Buffer++;
  17.         Length--;
  18.     }
  19. //    RS485_C_LW;
  20. }
复制代码

6. 接收一个字节
  1. uint8_t UART_Recive(void)
  2. {   
  3.     while(!(USART1->ISR & (1<<5)));//µÈ´ý½ÓÊÕµ½Êý¾Ý
  4.     return(USART1->RDR);             //¶Á³öÊý¾Ý
  5. }
  6. 7. PUCHAR_PROTOTYPE 函数

  7. PUTCHAR_PROTOTYPE
  8. {
  9. /* ½«PrintfÄÚÈÝ·¢Íù´®¿Ú */
  10.   USART_SendData(USART1,(uint8_t)  ch);
  11.   while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
  12.     {}

  13.   return (ch);
  14. }
复制代码


8. UART接收中断函数

  1. void USART1_IRQHandler(void)
  2. {
  3.     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  4.     {
  5.             if(TimeInterval > 4 && TimeInterval < 6)
  6.             {
  7.                 Uart1_Cnt = 0;
  8.             }
  9.             if(Uart1_Cnt > 60)
  10.             {
  11.                  Uart1_Cnt =0;
  12.             }
  13. /*            if(Uart1_Cnt == 0)
  14.             {
  15.                 Uart1_Cnt =0;
  16.                 Uart1_RxBuf[Uart1_Cnt]=USART_ReceiveData(USART1);//¶ÁÈ¡UART1½ÓÊÕµ½µÄÊý¾Ý²¢Êä³ö
  17.             }
  18.             else */
  19.             {
  20.                 Uart1_RxBuf[Uart1_Cnt]=USART_ReceiveData(USART1);//¶ÁÈ¡UART1½ÓÊÕµ½µÄÊý¾Ý²¢Êä³ö
  21.                 Uart1_Cnt++;
  22.             }
  23. //            Uart1_Cnt++;
  24.             TimeInterval = 0;
  25.             TimeRxFlag = 1;
  26.     }
  27. }
复制代码



收藏 评论0 发布时间:2021-11-22 21:03

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版