发 帖  
原厂入驻New

[经验] 【雨的笔记】STM32F1系列部分程序汇总-----------串口

2019-12-25 21:12:59  810 STM32F103 串口
分享
0
串口
用的串口1
PA9 txd对应的复用推挽输出 P10 rxd对应的浮空输入
8FBMMG_2X4LJNMHM6J)1%_5.png
寄存器接受数据次高位需要为0x0d,最高位需要0x0a。
功能:发送一串数据接受一串数据
串口到后面添加更多的东西就更复杂,之后用多个串口多个定时器完成不同的功能,现在先添加最简单的串口作用。
usart.h
  1. #IFndef  _USART_H_
  2. #define  _USART_H_

  3. #define RECEIVE_MAX_BYTE  100

  4. #include "STM32f10x.h"

  5. void usart_init(int bps);
  6. void USART1_DEAL(void);

  7. #endif
复制代码
usart.c
  1. #include "usart.h"

  2. void usart_init(int bps)
  3. {
  4.         GPIO_InitTypeDef  GPIO_INIT_USART1;
  5.         USART_InitTypeDef USART_INIT_USART1;
  6.         NVIC_InitTypeDef  NVIC_INIT_USART1;
  7.         
  8.         RCC_APB2PeriphclockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1,ENABLE);
  9.         
  10.         GPIO_INIT_USART1.GPIO_Mode  = GPIO_Mode_AF_PP;
  11.         GPIO_INIT_USART1.GPIO_Pin   = GPIO_Pin_9;
  12.         GPIO_INIT_USART1.GPIO_Speed = GPIO_Speed_50MHz;
  13.         GPIO_Init(GPIOA,&GPIO_INIT_USART1);
  14.         
  15.         GPIO_INIT_USART1.GPIO_Mode  = GPIO_Mode_IN_FLOAtiNG;
  16.         GPIO_INIT_USART1.GPIO_Pin   = GPIO_Pin_10;
  17.         GPIO_INIT_USART1.GPIO_Speed = GPIO_Speed_50MHz;
  18.         GPIO_Init(GPIOA,&GPIO_INIT_USART1);
  19.         
  20.         USART_INIT_USART1.USART_BaudRate                                                 = bps;
  21.         USART_INIT_USART1.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  22.         USART_INIT_USART1.USART_Mode                                                          = USART_Mode_Rx|USART_Mode_Tx;
  23.         USART_INIT_USART1.USART_Parity                                                         = USART_Parity_No;
  24.         USART_INIT_USART1.USART_StopBits                                                 = USART_StopBits_1;
  25.         USART_INIT_USART1.USART_WordLength                                         = USART_WordLength_8b;
  26.         
  27.         USART_Init(USART1,&USART_INIT_USART1);
  28.         
  29.         USART_Cmd(USART1,ENABLE);
  30.         USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
  31.         
  32.         NVIC_INIT_USART1.NVIC_IRQChannel                                                                                 = USART1_IRQn;
  33.         NVIC_INIT_USART1.NVIC_IRQChannelCmd                                                                 = ENABLE;
  34.         NVIC_INIT_USART1.NVIC_IRQChannelSubPriority                                 = 0;
  35.         NVIC_INIT_USART1.NVIC_IRQChannelPreemptionPriority  = 0;
  36.         NVIC_Init(&NVIC_INIT_USART1);
  37.         
  38. }

  39. int   usart_state = 0;
  40. char  receive_data[RECEIVE_MAX_BYTE] = "\0";

  41. void USART1_IRQHandler(void)
  42. {
  43.     u8 ch;
  44.    if(USART_GetITStatus(USART1,USART_IT_RXNE))
  45.    {
  46.      ch = USART_ReceiveData(USART1);
  47.      if((usart_state & 0x8000) == 0)
  48.      {
  49.         if(usart_state & 0x4000)
  50.         {
  51.            if(ch != 0x0a)usart_state = 0;
  52.            else usart_state |= 0x8000;
  53.         }
  54.        else
  55.         {
  56.           if(ch == 0x0d)usart_state |= 0x4000;
  57.           else
  58.           {
  59.              receive_data[usart_state&0x3FFF] = ch;
  60.              usart_state++;
  61.              if(usart_state > RECEIVE_MAX_BYTE - 1)
  62.              usart_state = 0;
  63.            }
  64.         }
  65.       }
  66.     }
  67. }

  68. void USART1_DEAL(void)
  69. {
  70.                 int i = 0;
  71.                 int data_len = 0;
  72.                 if(usart_state & 0x8000)
  73.                 {
  74.    data_len =  usart_state&0x3FFF;
  75.    for(i = 0; i < data_len; i++)
  76.      {
  77.        USART_SendData(USART1,receive_data[i]);
  78.        while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
  79.      }
  80.      USART_SendData(USART1,0x0d);
  81.      while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
  82.      USART_SendData(USART1,0x0a);
  83.      while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
  84.      usart_state = 0;
  85.    }
  86. }

复制代码
main.c
  1. #include "stm32f10x.h"
  2. #include "LED.h"
  3. #include "beep.h"
  4. #include "delay.h"
  5. #include "key.h"
  6. #include "usart.h"

  7. int main(void)
  8. {
  9.         unsigned int key_value;
  10.         led_init();
  11.         //beep_init();
  12.         delay_init();
  13.         key_init();
  14.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
  15.         usart_init(115200);
  16.         while(1)
  17.         {
  18.                 key_value = key_scan();
  19.                 key_debounce(key_value);
  20.                 USART1_DEAL();
  21.         }
  22. }

复制代码


相关经验

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发经验
关闭

站长推荐 上一条 /7 下一条

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