历史上的今天
返回首页

历史上的今天

今天是:2025年06月01日(星期日)

2018年06月01日 | STM8S 串口应用 UART2 STM8S105

2018-06-01 来源:eefocus

  1. //少说话,多做事,以下是我验证过没有问题的串口发送接受数据  

  2. //使用MCU stm8s105c6  UART2  

  3.   

  4. //初始化时调用:  

  5.   GPIO_DeInit(GPIOD);  

  6.   /* Configure PD5/6  */  

  7.   GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_IN_PU_NO_IT);//发送数据IO  

  8.   GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT);//接受数据IO  

  9.   UART2_DeInit();  

  10.  UART2_Init(2400,UART2_WORDLENGTH_8D,UART2_STOPBITS_1,UART2_PARITY_NO,\  

  11.             UART2_SYNCMODE_CLOCK_DISABLE,\  

  12.       UART2_MODE_TX_ENABLE|UART2_MODE_RX_ENABLE);  //波特率 2400 8位数据    

  13.   

  14. //1个停止位  没有奇偶校验 关闭SCK 允许串口接受和发送  

  15.   UART2_Cmd(ENABLE);//启用串口  

  16.   UART2_ITConfig(UART2_IT_RXNE_OR,ENABLE);//允许接受中断  

  17.   

  18.   

  19. //操作串口(发送接受数据)时调用:  

  20.   

  21.   

  22.   

  23.                 if(UART2_GetFlagStatus(UART2_FLAG_TC))  

  24.                  {//当前没有在发数据,可以发数据  

  25.                     UART2_SendData8(Uart2TexData);   

  26.                      UART2_ClearFlag(UART2_FLAG_TC);  

  27.                  }  

  28.   

  29.   

  30.     UART2_ClearITPendingBit(UART2_FLAG_RXNE);//清中断标志位  

  31.     Uart2RecData = UART2_ReceiveData8();//接受中断数据//后面两句需要发在  

  32.   

  33. 串口接受中断中  

  34.   

  35.   

  36. void UART2_DeInit(void)  

  37. {  

  38.     u8 dummy = 0;  

  39.     /*< Clear the Idle Line Detected bit in the status rerister by a read 

  40.        to the UART2_SR register followed by a Read to the UART2_DR  

  41.  

  42. register */  

  43.     dummy = UART2->SR;  

  44.     dummy = UART2->DR;  

  45.   

  46.     UART2->BRR2 = UART2_BRR2_RESET_VALUE;  /*< Set UART2_BRR2 to reset  

  47.  

  48. value 0x00 */  

  49.     UART2->BRR1 = UART2_BRR1_RESET_VALUE;  /*< Set UART2_BRR1 to reset  

  50.  

  51. value 0x00 */  

  52.   

  53.     UART2->CR1 = UART2_CR1_RESET_VALUE; /*< Set UART2_CR1 to reset value  

  54.  

  55. 0x00  */  

  56.     UART2->CR2 = UART2_CR2_RESET_VALUE; /*< Set UART2_CR2 to reset value  

  57.  

  58. 0x00  */  

  59.     UART2->CR3 = UART2_CR3_RESET_VALUE;  /*< Set UART2_CR3 to reset value  

  60.  

  61. 0x00  */  

  62.     UART2->CR4 = UART2_CR4_RESET_VALUE;  /*< Set UART2_CR4 to reset value  

  63.  

  64. 0x00  */  

  65.     UART2->CR5 = UART2_CR5_RESET_VALUE; /*< Set UART2_CR5 to reset value  

  66.  

  67. 0x00  */  

  68.     UART2->CR6 = UART2_CR6_RESET_VALUE; /*< Set UART2_CR6 to reset value  

  69.  

  70. 0x00  */  

  71.   

  72. }  

  73. void UART2_Init(u32 BaudRate, UART2_WordLength_TypeDef WordLength,   

  74.   

  75. UART2_StopBits_TypeDef StopBits, UART2_Parity_TypeDef Parity,   

  76.   

  77. UART2_SyncMode_TypeDef SyncMode, UART2_Mode_TypeDef Mode)  

  78. {  

  79.     u8 BRR2_1, BRR2_2 = 0;  

  80.     u32 BaudRate_Mantissa, BaudRate_Mantissa100 = 0;  

  81.   

  82.     /* assert_param: BaudRate value should be <= 625000 bps */  

  83.     assert_param(IS_UART2_BAUDRATE_OK(BaudRate));  

  84.   

  85.     assert_param(IS_UART2_WORDLENGTH_OK(WordLength));  

  86.   

  87.     assert_param(IS_UART2_STOPBITS_OK(StopBits));  

  88.   

  89.     assert_param(IS_UART2_PARITY_OK(Parity));  

  90.   

  91.     /* assert_param: UART2_Mode value should exclude values such as   

  92.  

  93. UART2_ModeTx_Enable|UART2_ModeTx_Disable */  

  94.     assert_param(IS_UART2_MODE_OK((u8)Mode));  

  95.   

  96.     /* assert_param: UART2_SyncMode value should exclude values such as 

  97.        UART2_CLOCK_ENABLE|UART2_CLOCK_DISABLE */  

  98.     assert_param(IS_UART2_SYNCMODE_OK((u8)SyncMode));  

  99.   

  100.     UART2->CR1 &= (u8)(~UART2_CR1_M);  /**< Clear the word length bit */  

  101.     UART2->CR1 |= (u8)WordLength; /**< Set the word length bit according  

  102.  

  103. to UART2_WordLength value */  

  104.   

  105.     UART2->CR3 &= (u8)(~UART2_CR3_STOP);  /**< Clear the STOP bits */  

  106.     UART2->CR3 |= (u8)StopBits;  /**< Set the STOP bits number according  

  107.  

  108. to UART2_StopBits value  */  

  109.   

  110.     UART2->CR1 &= (u8)(~(UART2_CR1_PCEN | UART2_CR1_PS  ));  /**< Clear  

  111.  

  112. the Parity Control bit */  

  113.     UART2->CR1 |= (u8)Parity;  /**< Set the Parity Control bit to  

  114.  

  115. UART2_Parity value */  

  116.   

  117.     UART2->BRR1 &= (u8)(~UART2_BRR1_DIVM);  /**< Clear the LSB mantissa  

  118.  

  119. of UARTDIV  */  

  120.     UART2->BRR2 &= (u8)(~UART2_BRR2_DIVM);  /**< Clear the MSB mantissa  

  121.  

  122. of UARTDIV  */  

  123.     UART2->BRR2 &= (u8)(~UART2_BRR2_DIVF);  /**< Clear the Fraction bits  

  124.  

  125. of UARTDIV */  

  126.   

  127.     /**< Set the UART2 BaudRates in BRR1 and BRR2 registers according to  

  128.  

  129. UART2_BaudRate value */  

  130.     BaudRate_Mantissa    = ((u32)CLK_GetClockFreq() / (BaudRate << 4));  

  131.     BaudRate_Mantissa100 = (((u32)CLK_GetClockFreq() * 100) / (BaudRate   

  132.   

  133. << 4));  

  134.     /**< The fraction and MSB mantissa should be loaded in one step in  

  135.  

  136. the BRR2 register*/  

  137.     BRR2_1 = (u8)((u8)(((BaudRate_Mantissa100 - (BaudRate_Mantissa *   

  138.   

  139. 100))  

  140.                         << 4) / 100) & (u8)0x0F); /**< Set the fraction  

  141.  

  142. of UARTDIV  */  

  143.     BRR2_2 = (u8)((BaudRate_Mantissa >> 4) & (u8)0xF0);  

  144.   

  145.     UART2->BRR2 = (u8)(BRR2_1 | BRR2_2);  

  146.     UART2->BRR1 = (u8)BaudRate_Mantissa;           /**< Set the LSB  

  147.  

  148. mantissa of UARTDIV  */  

  149.   

  150.     UART2->CR2 &= (u8)~(UART2_CR2_TEN | UART2_CR2_REN); /**< Disable the  

  151.  

  152. Transmitter and Receiver before seting the LBCL, CPOL and CPHA bits */  

  153.     UART2->CR3 &= (u8)~(UART2_CR3_CPOL | UART2_CR3_CPHA |   

  154.   

  155. UART2_CR3_LBCL); /**< Clear the Clock Polarity, lock Phase, Last Bit  

  156.  

  157. Clock pulse */  

  158.     UART2->CR3 |= (u8)((u8)SyncMode & (u8)(UART2_CR3_CPOL |   

  159.   

  160. UART2_CR3_CPHA | UART2_CR3_LBCL));  /**< Set the Clock Polarity, lock  

  161.  

  162. Phase, Last Bit Clock pulse */  

  163.   

  164.     if ((u8)Mode & (u8)UART2_MODE_TX_ENABLE)  

  165.     {  

  166.         UART2->CR2 |= (u8)UART2_CR2_TEN;  /**< Set the Transmitter Enable  

  167.  

  168. bit */  

  169.     }  

  170.     else  

  171.     {  

  172.         UART2->CR2 &= (u8)(~UART2_CR2_TEN);  /**< Clear the Transmitter  

  173.  

  174. Disable bit */  

  175.     }  

  176.     if ((u8)Mode & (u8)UART2_MODE_RX_ENABLE)  

  177.     {  

  178.         UART2->CR2 |= (u8)UART2_CR2_REN;  /**< Set the Receiver Enable  

  179.  

  180. bit */  

  181.     }  

  182.     else  

  183.     {  

  184.         UART2->CR2 &= (u8)(~UART2_CR2_REN);  /**< Clear the Receiver  

  185.  

  186. Disable bit */  

  187.     }  

  188.     /**< Set the Clock Enable bit, lock Polarity, lock Phase and Last Bit  

  189.  

  190. Clock pulse bits according to UART2_Mode value */  

  191.     if ((u8)SyncMode&(u8)UART2_SYNCMODE_CLOCK_DISABLE)  

  192.     {  

  193.         UART2->CR3 &= (u8)(~UART2_CR3_CKEN); /**< Clear the Clock Enable  

  194.  

  195. bit */  

  196.         /**< configure in Push Pull or Open Drain mode the Tx I/O line by  

  197.  

  198. setting the correct I/O Port register according the product package and  

  199.  

  200. line configuration*/  

  201.     }  

  202.     else  

  203.     {  

  204.         UART2->CR3 |= (u8)((u8)SyncMode & UART2_CR3_CKEN);  

  205.     }  

  206. }  

  207.   

  208. void UART2_Cmd(FunctionalState NewState)  

  209. {  

  210.   

  211.     if (NewState != DISABLE)  

  212.     {  

  213.         UART2->CR1 &= (u8)(~UART2_CR1_UARTD); /**< UART2 Enable */  

  214.     }  

  215.     else  

  216.     {  

  217.         UART2->CR1 |= UART2_CR1_UARTD;  /**< UART2 Disable (for low power  

  218.  

  219. consumption) */  

  220.     }  

  221. }  

  222.   

  223. void UART2_ITConfig(UART2_IT_TypeDef UART2_IT, FunctionalState NewState)  

  224. {  

  225.     u8 uartreg, itpos = 0x00;  

  226.     assert_param(IS_UART2_CONFIG_IT_OK(UART2_IT));  

  227.     assert_param(IS_FUNCTIONALSTATE_OK(NewState));  

  228.   

  229.     /* Get the UART2 register index */  

  230.     uartreg = (u8)(UART2_IT >> 0x08);  

  231.   

  232.     /* Get the UART2 IT index */  

  233.     itpos = (u8)((u8)1 << (u8)((u8)UART2_IT & (u8)0x0F));  

  234.   

  235.     if (NewState != DISABLE)  

  236.     {  

  237.         /**< Enable the Interrupt bits according to UART2_IT mask */  

  238.         if (uartreg == 0x01)  

  239.         {  

  240.             UART2->CR1 |= itpos;  

  241.         }  

  242.         else if (uartreg == 0x02)  

  243.         {  

  244.             UART2->CR2 |= itpos;  

  245.         }  

  246.         else if (uartreg == 0x03)  

  247.         {  

  248.             UART2->CR4 |= itpos;  

  249.         }  

  250.         else  

  251.         {  

  252.             UART2->CR6 |= itpos;  

  253.         }  

  254.     }  

  255.     else  

  256.     {  

  257.         /**< Disable the interrupt bits according to UART2_IT mask */  

  258.         if (uartreg == 0x01)  

  259.         {  

  260.             UART2->CR1 &= (u8)(~itpos);  

  261.         }  

  262.         else if (uartreg == 0x02)  

  263.         {  

  264.             UART2->CR2 &= (u8)(~itpos);  

  265.         }  

  266.         else if (uartreg == 0x03)  

  267.         {  

  268.             UART2->CR4 &= (u8)(~itpos);  

  269.         }  

  270.         else  

  271.         {  

  272.             UART2->CR6 &= (u8)(~itpos);  

  273.         }  

  274.     }  

  275. }  

  276.   

  277. u8 UART2_ReceiveData8(void)  

  278. {  

  279.     return ((u8)UART2->DR);  

  280. }  

  281.   

  282. void UART2_SendData8(u8 Data)  

  283. {  

  284.     /* Transmit Data */  

  285.     UART2->DR = Data;  

  286. }  

  287.   

  288. FlagStatus UART2_GetFlagStatus(UART2_Flag_TypeDef UART2_FLAG)  

  289. {  

  290.     FlagStatus status = RESET;  

  291.   

  292.     /* Check parameters */  

  293.     assert_param(IS_UART2_FLAG_OK(UART2_FLAG));  

  294.   

  295.     /* Check the status of the specified UART2 flag*/  

  296.     if (UART2_FLAG == UART2_FLAG_LBDF)  

  297.     {  

  298.         if ((UART2->CR4 & (u8)UART2_FLAG) != (u8)0x00)  

  299.         {  

  300.             /* UART2_FLAG is set*/  

  301.             status = SET;  

  302.         }  

  303.         else  

  304.         {  

  305.             /* UART2_FLAG is reset*/  

  306.             status = RESET;  

  307.         }  

  308.     }  

  309.     else if (UART2_FLAG == UART2_FLAG_SBK)  

  310.     {  

  311.         if ((UART2->CR2 & (u8)UART2_FLAG) != (u8)0x00)  

  312.         {  

  313.             /* UART2_FLAG is set*/  

  314.             status = SET;  

  315.         }  

  316.         else  

  317.         {  

  318.             /* UART2_FLAG is reset*/  

  319.             status = RESET;  

  320.         }  

  321.     }  

  322.     else if ((UART2_FLAG == UART2_FLAG_LHDF) || (UART2_FLAG ==   

  323.   

  324. UART2_FLAG_LSF))  

  325.     {  

  326.         if ((UART2->CR6 & (u8)UART2_FLAG) != (u8)0x00)  

  327.         {  

  328.             /* UART2_FLAG is set*/  

  329.             status = SET;  

  330.         }  

  331.         else  

  332.         {  

  333.             /* UART2_FLAG is reset*/  

  334.             status = RESET;  

  335.         }  

  336.     }  

  337.     else  

  338.     {  

  339.         if ((UART2->SR & (u8)UART2_FLAG) != (u8)0x00)  

  340.         {  

  341.             /* UART2_FLAG is set*/  

  342.             status = SET;  

  343.         }  

  344.         else  

  345.         {  

  346.             /* UART2_FLAG is reset*/  

  347.             status = RESET;  

  348.         }  

  349.     }  

  350.   

  351.     /* Return the UART2_FLAG status*/  

  352.     return  status;  

  353. }  

  354.   

  355. void UART2_ClearFlag(UART2_Flag_TypeDef UART2_FLAG)  

  356. {  

  357.     assert_param(IS_UART2_CLEAR_FLAG_OK(UART2_FLAG));  

  358.   

  359.     /*< Clear the Receive Register Not Empty flag */  

  360.     if (UART2_FLAG == UART2_FLAG_RXNE)  

  361.     {  

  362.         UART2->SR = (u8)~(UART2_SR_RXNE);  

  363.     }  

  364.     /*< Clear the LIN Break Detection flag */  

  365.     else if (UART2_FLAG == UART2_FLAG_LBDF)  

  366.     {  

  367.         UART2->CR4 &= (u8)(~UART2_CR4_LBDF);  

  368.     }  

  369.     /*< Clear the LIN Header Detection Flag */  

  370.     else if (UART2_FLAG == UART2_FLAG_LHDF)  

  371.     {  

  372.         UART2->CR6 &= (u8)(~UART2_CR6_LHDF);  

  373.     }  

  374.     /*< Clear the LIN Synch Field flag */  

  375.     else  

  376.     {  

  377.         UART2->CR6 &= (u8)(~UART2_CR6_LSF);  

  378.     }  

  379.   

  380. }  


推荐阅读

史海拾趣

安森德(Ascend)公司的发展小趣事

随着产品技术的成熟,安森德公司开始积极拓展市场。公司凭借优质的产品和服务,成功进入工业电源、电机驱动、消费电子等多个领域。同时,安森德积极寻求与全球顶尖企业的战略合作,通过与这些企业的技术交流和业务合作,不断提升自身的技术水平和市场竞争力。这些合作不仅为安森德带来了更多的商业机会,也进一步提升了公司在行业内的知名度和影响力。

艾迈斯(AMASS)公司的发展小趣事

在产品研发和技术创新的同时,艾迈斯(AMASS)公司也注重品牌建设和市场推广。公司积极参加各种行业展会和交流活动,与业界同行建立了广泛的合作关系。同时,艾迈斯还通过广告宣传、媒体报道等多种方式提升品牌知名度和影响力。这些努力使得艾迈斯在电子行业中的地位逐渐提升,成为了业内颇具影响力的品牌之一。

永丰盈(CST)公司的发展小趣事

在稳步发展国内市场的同时,CST积极拓展国际市场。公司建立了分布世界各地的销售渠道,与多家国际知名企业建立了长期稳定的合作关系。通过不断的市场拓展和品牌建设,CST在国际市场上树立了良好的企业形象和品牌形象。

德旭电子(DEXU)公司的发展小趣事

随着公司规模的不断扩大和业务范围的不断拓展,德旭电子开始注重履行社会责任和推动可持续发展。公司积极参与公益事业和社会活动回馈社会。

在环保方面德旭电子坚持绿色生产和低碳发展理念积极推广环保技术和设备降低生产过程中的能耗和排放。同时公司还注重产品的环保性能研发和生产符合环保标准的产品满足客户的环保需求。

在社会责任方面德旭电子关注员工福利和职业发展为员工提供良好的工作环境和培训机会促进员工的成长和发展。此外公司还积极参与社会公益事业和慈善活动为社会做出积极贡献。

通过这些举措德旭电子在履行社会责任和推动可持续发展方面取得了显著成效赢得了社会的广泛认可和赞誉。

Captive Fastener公司的发展小趣事

随着全球市场的不断扩大,Captive Fastener公司意识到国际合作的重要性。公司积极寻求与国际知名电子制造商的合作机会,通过提供高质量的紧固件产品和技术支持,成功打入国际市场。同时,公司还与国外同行开展技术交流与合作,不断提升自身的技术水平和市场竞争力。

CyOptics Inc公司的发展小趣事

除了数据通讯和电信市场外,CyOptics的光学产品还逐渐拓展至其他领域。例如,公司的光学组件已集成至光学收发器、转发器及线卡等设备中,为数据中心、高性能计算和企业存储网络等应用提供了强有力的支持。此外,CyOptics还积极开拓新兴市场,如数据库、地铁及长途干线市场等,为客户提供定制化的光学解决方案。

问答坊 | AI 解惑

开关电源功率变压器的设计方法

开关电源功率变压器的设计方法…

查看全部问答>

好不容易突破4000分,特散200分

好不容易突破4000分,特散200分…

查看全部问答>

NIOSII移植uclinux

      哪位大哥做过NIOSII移植uclinux的。。。。请教小弟一下。。。谢谢。。。。…

查看全部问答>

自制触摸屏

$(\'swf_BbR\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/XMzYxMjgxNDMy/v.sw ...…

查看全部问答>

MEGA16的AD的通道转换问题

我想用mega16自带的AD,且要两个通道不停转换,但不知道程序什么地方出问题了,用protues仿真AD通道只能一个变换,有时候甚至不能变换,求助 用的是icc+protues: 程序如下: #include <iom16v.h>#include \"string.h\"#include \"lcd1602.h ...…

查看全部问答>

求助!!AD9851

本帖最后由 paulhyde 于 2014-9-15 04:17 编辑 求各位大神指导!!我用AD9851产生波形,用的网上的程序,应该没有问题,但烧到单片机里之后,芯片输出电压为电源电压,根本就没有波形,是怎么回事啊,会不会是芯片坏了?但我复位的时候会有0出现。 ...…

查看全部问答>

本人刚刚从事微波射频行业,有没有什么入门的书求推荐

本人刚刚从事微波射频行业,有没有什么入门的书求推荐…

查看全部问答>

求推荐一款DSP+FPGA开发板

马上年底了,又要花钱了。 想买一款DSP+FPGA的开发板,价格3K以内都可以,要求质量好就可以。 小伙伴们有没有好的企业可以推荐?…

查看全部问答>

MSP430串口打印上位机新方法

要给大家介绍一个叫做nodejs的东西,这是一个用HTML/JS来编写的GUI的工程。大家可以在这里找到源码 这样我们还可以使用网页打开(传送) …

查看全部问答>

阻抗、阻抗角、阻抗模的计算

请问哪位大神知道一下的计算公式:电阻电容串联、并联,电容电感串联、并联的阻抗、阻抗角、阻抗模的计算公式,谢谢了…

查看全部问答>