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

再来一发(换行输出(寄存器版))

[复制链接]
在路上11111111 发布时间:2016-12-8 20:45
  1. /*******************************************************/
  2. /************PA^9是TX(推免输出),PA^10是RX(浮空输入)*****/
  3.             

  4. #define   __IO   volatile
  5. typedef   unsigned int uint32_t;
  6. typedef   unsigned short int uint16_t;
  7. typedef   unsigned char  u8_t;

  8. typedef   __IO uint32_t  vu32;
  9. typedef   __IO uint16_t  vu16;
  10. typedef   uint16_t       u16;
  11. typedef   __IO uint32_t  vu32;
  12. typedef   u8_t           uint8_t;

  13. #define   CMD_STRING_SIZE  128

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


  31. /***********GPIOD***********/
  32. typedef struct
  33. {
  34.     __IO uint32_t CRL;
  35.         __IO uint32_t CRH;
  36.         __IO uint32_t IDR;
  37.         __IO uint32_t ODR;
  38.         __IO uint32_t BSRR;
  39.         __IO uint32_t BRR;
  40.         __IO uint32_t LCKR;
  41. }GPIO_TypeDef;

  42. typedef struct
  43. {
  44.    __IO uint32_t ACR;
  45. }FLASH_INTERFACE;

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

  51. /**************GPIOD管脚的内存对应地址**********/
  52. #define  PERIPH_BASE      ((uint32_t) 0x40000000)
  53. #define  APB2PERIPH_BASE  (PERIPH_BASE + 0x10000)
  54. #define  GPIOD_BASE       (APB2PERIPH_BASE + 0x1400)
  55. #define  GPIOD            ((GPIO_TypeDef *) GPIOD_BASE)

  56. #define  FLASH_BASE       ((uint32_t) 0x40022000)
  57. #define  FLASH            ((FLASH_INTERFACE *) FLASH_BASE)

  58. #define   RCC_APB2Periph_AFIO     ((uint32_t)   0x000000001)
  59. #define   RCC_APB2Periph_GPIOA    ((uint32_t)   0x000000004)
  60. #define   RCC_APB2Periph_GPIOB    ((uint32_t)   0x000000008)
  61. #define   RCC_APB2Periph_GPIOC    ((uint32_t)   0x000000010)
  62. #define   RCC_APB2Periph_GPIOD    ((uint32_t)   0x000000020)

  63. typedef  enum {RESET = 0,SET = !RESET } FlagStatus, ITStatus;

  64. #define  USRAT_FLAG_CTS           ((uint16_t)   0x0200)
  65. #define  USART_FLAG_LBD           ((uint16_t)        0x0100)
  66. #define  USART_FLAG_TXE           ((uint16_t)        0x0080)
  67. #define  USART_FLAG_TC            ((uint16_t)        0x0040)
  68. #define  USART_FLAG_RXNE          ((uint16_t)        0x0020)
  69. #define  USART_FLAG_IDLE                  ((uint16_t)        0x0010)
  70. #define  USART_FLAG_ORE           ((uint16_t)   0x0008)
  71. #define  USART_FLAG_NE            ((uint16_t)   0x0004)
  72. #define  USART_FLAG_FE            ((uint16_t)   0x0002)
  73. #define  USART_FLAG_PE            ((uint16_t)   0x0001)


  74. typedef struct
  75. {
  76.     __IO uint32_t  CR;
  77.         __IO uint32_t  CFGR;
  78.         __IO uint32_t  CIR;
  79.         __IO uint32_t  APB2RSTR;
  80.         __IO uint32_t  APB1RSTR;
  81.         __IO uint32_t  AHBENR;
  82.         __IO uint32_t  APB2ENR;
  83.         __IO uint32_t  APB1ENR;
  84.         __IO uint32_t  BDCR;
  85.         __IO uint32_t  CSR;
  86.         __IO uint32_t  AHBRSTR;
  87.         __IO uint32_t  CFGR2;
  88. }RCC_TypeDef;

  89. /******************RCC时钟**********/
  90. #define  AHBPERIPH_BASE      (PERIPH_BASE + 0x20000)
  91. #define  RCC_BASE            (AHBPERIPH_BASE + 0x1000)
  92. #define  RCC                       ((RCC_TypeDef *)RCC_BASE)


  93. void RCC_Init()//72
  94. {
  95.      unsigned char sws = 0;
  96.          RCC->CR |= 0x00010000;
  97.          while(!(RCC->CR>>17));
  98.          RCC->CFGR2 |= 4<<4;
  99.          RCC->CFGR2 |= 6<<8;
  100.          RCC->CFGR2 |= 1<<16;
  101.          RCC->CR    |= 1<<26;
  102.          while(!(RCC->CR>>27));
  103.          RCC->CFGR2 |= 0x00000004;
  104.          RCC->CFGR  |= 1<<16;
  105.          RCC->CFGR  |= 7<<18;
  106.          RCC->CFGR  |= 1<<16;
  107.          RCC->CR    |= 1<<24;
  108.          FLASH->ACR  |= 0x32;
  109.          while(!(RCC->CR>>25));
  110.          RCC->CFGR   |= 1<<1;
  111.          while(sws != 0x2)
  112.          {
  113.              sws = RCC->CFGR>>2;
  114.                  
  115.                  sws &= 0x3;
  116.          }
  117. }

  118. #define LEDON  (GPIOD->BRR  |= GPIO_Pin_2)
  119. #define LEDOFF (GPIOD->BSRR |= GPIO_Pin_2)

  120. void LED_Init()
  121. {
  122.     RCC->APB2ENR  |= RCC_APB2Periph_GPIOD;
  123.         GPIOD->CRL    &= 0xFFFFF0FF;
  124.         GPIOD->CRL    |= 0x00000300;
  125.         GPIOD->BSRR   |= GPIO_Pin_2;
  126. }
  127. void Delay(vu32 nCount)
  128. {
  129.   for(;nCount != 0;nCount--);
  130. }

  131. typedef struct
  132. {
  133.    vu16 SR;
  134.    u16  RESERVED0;
  135.    vu16 DR;
  136.    u16  RESERVED1;
  137.    vu16 BRR;
  138.    u16  RESERVED2;
  139.    vu16 CR1;
  140.    u16  RESERVED3;
  141.    vu16 CR2;
  142.    u16  RESERVED4;
  143.    vu16 CR3;
  144.    u16  RESERVED5;
  145.    vu16 GTPR;
  146.    u16  RESERVED6;
  147. }USART_TypeDef;
  148. /*********************USART1的内存对应地址******/
  149. //#define  PERIPH_BASE             ((uint32_t)0x40000000)
  150. #define  APB2PERIPH_BASE  (PERIPH_BASE + 0x10000)
  151. #define  USART1_BASE      (APB2PERIPH_BASE + 0x3800)
  152. #define  USART1           ((USART_TypeDef *)USART1_BASE)

  153. /**************串口配置步骤**********/
  154. /******
  155.        1:打开GPIOA的时钟(这个是因为中断的TX和RX的引脚分别PA^9和PA^10;
  156.            2:打开串口中断的时钟;
  157.            3:配置TX和RX的模式
  158.            在这里,我试过RX的输入模式可以是浮空输入模式,也可以是模拟输入模式
  159.            还可以是上/下拉模式,
  160.            4:设置波特率;
  161.            5:设置校验模式:(注意,在这里我试过偶校验模式,但是没弄出来,希望大家可以试试,
  162.                            如果大家谁试过奇偶校验的话,可以发个帖来分享下(谢谢咯))
  163.                                            我用的是无校验模式。
  164.                                            ****/
  165. void  USART_Init()
  166. {
  167.     float  USARTDIV;
  168.         u16    USARTDIV_zhengshu;
  169.         u16    USARTDIV_xiaoshu;

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

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

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

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

  198.         USART1->BRR = USARTDIV_zhengshu;
  199.         USART1->CR1 |= 0X200C;
  200. }

  201. FlagStatus   USART_GetFlagStatus(USART_TypeDef *USARTx,uint16_t USART_FLAG)
  202. {
  203.    FlagStatus bitstatus = RESET;
  204.    if((USARTx->SR & USART_FLAG)!= (uint16_t)RESET)
  205.    {
  206.        bitstatus = SET;   
  207.    }
  208.    else
  209.    {
  210.        bitstatus = RESET;
  211.    }
  212.    return bitstatus;
  213. }

  214. void USART_ClearFlag(USART_TypeDef *USARTx,uint16_t USART_FLAG)
  215. {
  216.    USARTx->SR = (uint16_t)~USART_FLAG;
  217. }
  218. void USART_SendData(USART_TypeDef* USARTx,char data)
  219. {
  220.     USARTx->DR = (data&(uint16_t)0X01FF);//实际上发送的数据的ASCI码的范围时0--127
  221.     while(USARTx->SR&0x40==0);//等待那个TC位(数据发送完成位)置1
  222. }
  223. void USART1_Printf(char *data)
  224. {
  225.    while(*data!='\0')
  226.    {
  227.        USART_SendData(USART1,*data);
  228.            while((USART1->SR&(uint16_t)0x80)==0);
  229.            /*TXE:发送数据寄存器空 (Transmit data register empty)  位7
  230.         当TDR寄存器中的数据被硬件转移到移位寄存器的时候,该位被硬件置位。如果USART_CR1
  231.         寄存器中的TXEIE为1,则产生中断。对USART_DR的写操作,将该位清零。
  232.         0:数据还没有被转移到移位寄存器;
  233.         1:数据已经被转移到移位寄存器。
  234.         注意:单缓冲器传输中使用该位******/
  235.            //USART1->SR &= ((uint16_t)0XFF7F);//清除数据位(清除TX位,有的时候还需要清除TC位,如果是TC和TXE位的
  236.            USART_ClearFlag(USART1,USART_FLAG_TXE);                                                         //时候是USART1->SR &= ((uint16_t)0xFF3F;
  237.            data++;
  238.    }
  239. }                                                                         

  240. uint32_t SerialKeyPressed(uint8_t *key)
  241. {  
  242.     if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) != RESET)
  243.         {
  244.              *key = (uint8_t)USART1->DR;
  245.                  return 1;
  246.         }
  247.         else
  248.            return 0;
  249. }

  250. uint8_t GetKey(void)
  251. {
  252.    uint8_t key = 0;
  253.    while(1)
  254.    {
  255.       if(SerialKeyPressed((uint8_t*)&key))
  256.              break;
  257.    }
  258.    return key;
  259. }

  260. void SerialPutChar(uint16_t c)
  261. {
  262.    USART_SendData(USART1,c);
  263.    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == 0)
  264.    {
  265.    }//判断TXE是否被置1
  266. }

  267. void GetInputString(uint8_t *buffP)
  268. {
  269.     uint32_t bytes_read = 0;
  270.         uint8_t  c = 0;
  271.         do
  272.         {
  273.             c = GetKey();
  274.                 if(c=='r')
  275.                   break;
  276.                 if(c == 'b')
  277.                 {
  278.                    if(bytes_read>0)
  279.                    {
  280.                  USART1_Printf("\b \b");
  281.                          bytes_read--;
  282.                    }
  283.                    continue;
  284.         }
  285.                 if(bytes_read >= (CMD_STRING_SIZE))
  286.                 {
  287.                     USART1_Printf("Command string size overflow\r\n");//如果发送的数据
  288.                                                                           //超过了128位的话就会报错
  289.                     bytes_read = 0;//记录数据的标志变为0
  290.                         continue;
  291.                 }
  292.                 if(c>=0x20&&c<=0x7E)
  293.                 {
  294.                    buffP[bytes_read++] = c;
  295.                    SerialPutChar(c);//输出数据
  296.                 }
  297.         }while(1);
  298.         USART1_Printf(("\n\r"));//换行
  299.         buffP[bytes_read] = '\0';//加上结束标志
  300. }
  301. int main(void)
  302. {
  303.     uint8_t inputstr[CMD_STRING_SIZE];
  304.     RCC_Init();
  305.         LED_Init();
  306.         USART_Init();
  307.            if(0x0020==(USART1->SR&0x0020))
  308.            {
  309.                          USART1->SR&= 0XFFDF;//这个是清除RXEN的
  310.                          USART_SendData(USART1,USART1->DR);
  311.                          while((USART1->SR&(uint16_t)0x80)==0);
  312.                          USART1->SR &= ((uint16_t)0XFF7F);//清除数据位
  313.                          USART_SendData(USART1,'\r');//换行
  314.                          while((USART1->SR&(uint16_t)0x80)==0);
  315.                          USART1->SR &= ((uint16_t)0XFF7F);
  316.                          USART_SendData(USART1,'\n');
  317.                          while((USART1->SR&(uint16_t)0x80)==0);
  318.                          USART1->SR &= ((uint16_t)0XFF7F);
  319. }


复制代码


收藏 3 评论4 发布时间:2016-12-8 20:45

举报

4个回答
在路上11111111 回答时间:2016-12-8 20:46:17
其中有很多函数没用到,那是我写的另一个程序的东西,大家不要在乎
leo121_3006061 回答时间:2016-12-8 21:03:02
多谢分享
jackten 回答时间:2016-12-8 21:55:13
谢谢分享                                             
zengyi703-16313 回答时间:2016-12-9 08:07:18
谢楼主分享

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

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