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

小白---------串口通信(寄存器)

[复制链接]
在路上11111111 发布时间:2016-12-4 15:00
  1. #define   __IO   volatile
  2. typedef   unsigned int uint32_t;
  3. typedef   unsigned short int uint16_t;
  4. typedef   unsigned char u8_t;

  5. typedef   __IO uint32_t  vu32;
  6. typedef   __IO uint16_t  vu16;
  7. typedef   uint16_t       u16;
  8. typedef   __IO uint32_t  vu32;

  9. #define   GPIO_Pin_0            ((uint16_t) 0x0001)
  10. #define   GPIO_Pin_1     ((uint16_t) 0x0002)
  11. #define   GPIO_Pin_2     ((uint16_t) 0x0004)
  12. #define   GPIO_Pin_3     ((uint16_t) 0x0008)
  13. #define   GPIO_Pin_4     ((uint16_t) 0x0010)
  14. #define   GPIO_Pin_5     ((uint16_t) 0x0020)
  15. #define   GPIO_Pin_6     ((uint16_t) 0x0040)
  16. #define   GPIO_Pin_7     ((uint16_t) 0x0080)
  17. #define   GPIO_Pin_8     ((uint16_t) 0x0100)
  18. #define   GPIO_Pin_9     ((uint16_t) 0x0200)
  19. #define   GPIO_Pin_10    ((uint16_t) 0x0400)
  20. #define   GPIO_Pin_11    ((uint16_t) 0x0800)
  21. #define   GPIO_Pin_12    ((uint16_t) 0x1000)
  22. #define   GPIO_Pin_13    ((uint16_t) 0x2000)
  23. #define   GPIO_Pin_14    ((uint16_t) 0x4000)
  24. #define   GPIO_Pin_15    ((uint16_t) 0x8000)
  25. #define   GPIO_Pin_All   ((uint16_t) 0xFFFF)


  26. /***********GPIOD***********/
  27. typedef struct
  28. {
  29.     __IO uint32_t CRL;
  30.         __IO uint32_t CRH;
  31.         __IO uint32_t IDR;
  32.         __IO uint32_t ODR;
  33.         __IO uint32_t BSRR;
  34.         __IO uint32_t BRR;
  35.         __IO uint32_t LCKR;
  36. }GPIO_TypeDef;

  37. typedef struct
  38. {
  39.    __IO uint32_t ACR;
  40. }FLASH_INTERFACE;

  41. /*********************GPIOA管脚的内存对应地址**********/
  42. #define  PERIPH_BASE      ((uint32_t)  0x40000000)
  43. #define  APB2PERIPH_BASE  (PERIPH_BASE + 0x10000)
  44. #define  GPIOA_BASE                  (APB2PERIPH_BASE + 0x0800)
  45. #define  GPIOA                 ((GPIO_TypeDef *) GPIOA_BASE)

  46. /**************GPIOD管脚的内存对应地址**********/
  47. #define  PERIPH_BASE      ((uint32_t) 0x40000000)
  48. #define  APB2PERIPH_BASE  (PERIPH_BASE + 0x10000)
  49. #define  GPIOD_BASE       (APB2PERIPH_BASE + 0x1400)
  50. #define  GPIOD            ((GPIO_TypeDef *) GPIOD_BASE)

  51. #define  FLASH_BASE       ((uint32_t) 0x40022000)
  52. #define  FLASH            ((FLASH_INTERFACE *) FLASH_BASE)

  53. #define   RCC_APB2Periph_AFIO     ((uint32_t)   0x000000001)
  54. #define   RCC_APB2Periph_GPIOA    ((uint32_t)   0x000000004)
  55. #define   RCC_APB2Periph_GPIOB    ((uint32_t)   0x000000008)
  56. #define   RCC_APB2Periph_GPIOC    ((uint32_t)   0x000000010)
  57. #define   RCC_APB2Periph_GPIOD    ((uint32_t)   0x000000020)


  58. typedef struct
  59. {
  60.     __IO uint32_t  CR;
  61.         __IO uint32_t  CFGR;
  62.         __IO uint32_t  CIR;
  63.         __IO uint32_t  APB2RSTR;
  64.         __IO uint32_t  APB1RSTR;
  65.         __IO uint32_t  AHBENR;
  66.         __IO uint32_t  APB2ENR;
  67.         __IO uint32_t  APB1ENR;
  68.         __IO uint32_t  BDCR;
  69.         __IO uint32_t  CSR;
  70.         __IO uint32_t  AHBRSTR;
  71.         __IO uint32_t  CFGR2;
  72. }RCC_TypeDef;

  73. /******************RCC时钟**********/
  74. #define  AHBPERIPH_BASE      (PERIPH_BASE + 0x20000)
  75. #define  RCC_BASE            (AHBPERIPH_BASE + 0x1000)
  76. #define  RCC                       ((RCC_TypeDef *)RCC_BASE)


  77. void RCC_Init()//72
  78. {
  79.      unsigned char sws = 0;
  80.          RCC->CR |= 0x00010000;
  81.          while(!(RCC->CR>>17));
  82.          RCC->CFGR2 |= 4<<4;
  83.          RCC->CFGR2 |= 6<<8;
  84.          RCC->CFGR2 |= 1<<16;
  85.          RCC->CR    |= 1<<26;
  86.          while(!(RCC->CR>>27));
  87.          RCC->CFGR2 |= 0x00000004;
  88.          RCC->CFGR  |= 1<<16;
  89.          RCC->CFGR  |= 7<<18;
  90.          RCC->CFGR  |= 1<<16;
  91.          RCC->CR    |= 1<<24;
  92.          FLASH->ACR  |= 0x32;
  93.          while(!(RCC->CR>>25));
  94.          RCC->CFGR   |= 1<<1;
  95.          while(sws != 0x2)
  96.          {
  97.              sws = RCC->CFGR>>2;
  98.                  
  99.                  sws &= 0x3;
  100.          }
  101. }

  102. #define LEDON  (GPIOD->BRR  |= GPIO_Pin_2)
  103. #define LEDOFF (GPIOD->BSRR |= GPIO_Pin_2)

  104. void LED_Init()
  105. {
  106.     RCC->APB2ENR  |= RCC_APB2Periph_GPIOD;
  107.         GPIOD->CRL    &= 0xFFFFF0FF;
  108.         GPIOD->CRL    |= 0x00000300;
  109.         GPIOD->BSRR   |= GPIO_Pin_2;
  110. }
  111. void Delay(vu32 nCount)
  112. {
  113.   for(;nCount != 0;nCount--);
  114. }

  115. typedef struct
  116. {
  117.    vu16 SR;
  118.    u16  RESERVED0;
  119.    vu16 DR;
  120.    u16  RESERVED1;
  121.    vu16 BRR;
  122.    u16  RESERVED2;
  123.    vu16 CR1;
  124.    u16  RESERVED3;
  125.    vu16 CR2;
  126.    u16  RESERVED4;
  127.    vu16 CR3;
  128.    u16  RESERVED5;
  129.    vu16 GTPR;
  130.    u16  RESERVED6;
  131. }USART_TypeDef;
  132. /*********************USART1的内存对应地址******/
  133. //#define  PERIPH_BASE             ((uint32_t)0x40000000)
  134. #define  APB2PERIPH_BASE  (PERIPH_BASE + 0x10000)
  135. #define  USART1_BASE      (APB2PERIPH_BASE + 0x3800)
  136. #define  USART1           ((USART_TypeDef *)USART1_BASE)

  137. /**************串口配置步骤**********/
  138. /******
  139.        1:打开GPIOA的时钟(这个是因为中断的TX和RX的引脚分别PA^9和PA^10;
  140.            2:打开串口中断的时钟;
  141.            3:配置TX和RX的模式
  142.            在这里,我试过RX的输入模式可以是浮空输入模式,也可以是模拟输入模式
  143.            还可以是上/下拉模式,
  144.            4:设置波特率;
  145.            5:设置校验模式:(注意,在这里我试过偶校验模式,但是没弄出来,希望大家可以试试,
  146.                            如果大家谁试过奇偶校验的话,可以发个帖来分享下(谢谢咯))
  147.                                            我用的是无校验模式。
  148.                                            ****/
  149. void  USART_Init()
  150. {
  151.     float  USARTDIV;
  152.         u16    USARTDIV_zhengshu;
  153.         u16    USARTDIV_xiaoshu;

  154.         RCC->APB2ENR |= 1<<2;//GPIOA的时钟打开
  155.         RCC->APB2ENR |= 1<<14;//打开串口的时钟

  156.         GPIOA->CRH &= 0XFFFFF00F;//
  157.         GPIOA->CRH |= 0X000008B0;//TX是推挽输出模式,RX是浮空输入(上下拉,模拟输入都可以)模式

  158.         USARTDIV = (float)(72*1000000)/(9600*16);//这是波特率的数值
  159.         USARTDIV_zhengshu =   USARTDIV;//取整数部分

  160.         USARTDIV_xiaoshu = (USARTDIV-USARTDIV_zhengshu)*16;//取小数部分,
  161.         /************0.0625变成整数的部分
  162.         0.0625,第二个0是2^-1,6是2^-2;2是2^-3;5是2^-4;
  163.         步骤是0.0625*2=0.125;整数部分是0;
  164.               0.125*2=0.25;  整数部分是0;
  165.                   0.25*2=0.5;    整数部分是0;
  166.                   0.5*2=1;       整数部分是1;
  167.                   所以排序是0001;代表的是整数1;
  168.         这里最大的0.99*2=1.98;整数部分是1;
  169.                            0.98*2=1.96;整数部分是1;
  170.                           0.96*2=1.92;整数部分是1;
  171.                           0.92*2=1.84;整数部分是1;
  172.         因为只有前四位是小数部分所以最大为F;
  173.         所以这里只需*16取整数部分即可;
  174.         **********************/
  175.         USARTDIV_zhengshu <<=4;//因为前四位是小数部分,所以需要左移4位;
  176.         USARTDIV_zhengshu += USARTDIV_xiaoshu;//这个就是波特的设定值了;
  177.         /***********当CPU刚开启动的时候都需要重新启动一下外设装置,确保外设装置能够在
  178.         正常供电后,稳定工作。
  179.         可以看到复位一次后就可以了,然后停止复位,让其正常的工作。******/
  180.         RCC->APB2RSTR |= 1<<14;//
  181.         RCC->APB2RSTR &= ~(1<<14);

  182.         USART1->BRR = USARTDIV_zhengshu;
  183.         USART1->CR1 |= 0X200c;
  184. }

  185. int main(void)
  186. {
  187.     RCC_Init();
  188.         LED_Init();
  189.         USART_Init();
  190.         while(1)
  191.         {
  192.                 USART1->DR = 0X41;//A
  193.                 LEDON;
  194.                 Delay(0xFFFFFF);
  195.                 LEDOFF;
  196.                 Delay(0xFFFFFF);
  197.         }
  198. }


复制代码


收藏 1 评论4 发布时间:2016-12-4 15:00

举报

4个回答
peter001 回答时间:2016-12-4 16:51:47
支持一下
andypanfan 回答时间:2016-12-4 16:58:11
谢谢分享  支持一下!!!!
yhyeefocus 回答时间:2016-12-4 17:39:43
寄存器版的串口通信,学习了
jackten 回答时间:2016-12-4 20:23:48
谢谢分享                  

所属标签

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