[STM8] 按下面这样发送可以吗?

[复制链接]
 楼主| yinxiangh 发表于 2018-7-26 20:10 | 显示全部楼层 |阅读模式
请教一下stm8的uart配置问题,我参照手册,初始化如下:void uart2_init()
{
  UART2->CR1  = 0x00;//8位数据位
  UART2->CR3  = 0x00;//1个停止位
  UART2->BRR2 = 0x02;//波特率9600bps,默认内部晶振,16M,16000000/9600=0000 0110 1000 0010,取头尾各4位
  UART2->BRR1 = 0x68;//取中间8位
  UART2->CR2  = 0x08;//发送使能
}

按下面这样发送可以吗?
if( data1 == !data2)
  {
    while(!(UART2->SR & 0x80));//数据发送到移位寄存器?
    UART2->DR = data2;
    while(!(UART2->SR & 0x40));//发送完成?
  }
pengf 发表于 2018-7-26 20:12 | 显示全部楼层
差不多了
renyaq 发表于 2018-7-26 20:12 | 显示全部楼层
就是这样,我用库函数写的时候也是这样
supernan 发表于 2018-7-26 20:14 | 显示全部楼层
<div class="blockcode"><blockquote>void UART_Init(void)
{
asm("sim"); //这个不能少
UART2_CR1_M=0; //8位数据
UART2_CR1_PCEN=0; //无校验
UART2_CR2_REN=1; //接收使能
UART2_CR2_TEN=1; //发送使能
UART2_CR3_STOP=0; //停止位1位
UART2_BRR2=0x0B; //波特率 0:3
UART2_BRR1=0x08; //波特率 4:11
UART2_CR2_RIEN=1; //开启接受中断
asm("rim");
}
supernan 发表于 2018-7-26 20:16 | 显示全部楼层
#pragma vector=UART2_R_RXNE_vector                     //中断向量号加2
__interrupt void UART2_handler(void)               
{
   if(UART2_SR_RXNE)
   {
                  DATA[k]=UART2_DR;
}
}
xxrs 发表于 2018-7-26 20:17 | 显示全部楼层
为什么不判断接收的状态位呢?
幸福小强 发表于 2018-7-26 20:38 | 显示全部楼层
  1. #include"stm8s.h"
  2. #include"stm8s_conf.h"
  3. #include"UART2.h"
  4. #include"stdarg.h"

  5. void    UART2_Config(u32 Rate)
  6. {
  7.       CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1,     ENABLE);
  8.       GPIO_Init(UART2_PORT,    TX2_PIN,     GPIO_MODE_OUT_PP_LOW_FAST);
  9.       GPIO_Init(UART2_PORT,    RX2_PIN,     GPIO_MODE_IN_PU_NO_IT);
  10.       UART2_Init(Rate, UART2_WORDLENGTH_8D, UART2_STOPBITS_1, UART2_PARITY_NO, UART2_SYNCMODE_CLOCK_DISABLE, UART2_MODE_TXRX_ENABLE);
  11.       UART2_ITConfig(UART2_IT_RXNE_OR,ENABLE);
  12.       UART2_Cmd(ENABLE);
  13. }

  14. void    UART2_SendByte(u8 Byte)
  15. {
  16.       while(!(UART2->SR & TC));
  17.       UART2->DR = Byte;
  18. }

  19. #pragma vector =ITC_IRQ_UART2_RX + 2
  20. __interrupt void   UART2_IRQHandler(void)
  21. {
  22.     u8  Temp;
  23.     if(UART2->SR & UART2_SR_RXNE)
  24.     {
  25.        Temp  =UART2->DR;
  26.        UART2->SR = ~UART2_SR_RXNE;
  27.        UART2_SendByte(Temp);
  28.     }   
  29. }

  30. char   * UART2_itoa(int value, char *string, int radix)
  31. {
  32.     int     i, d;
  33.     int     flag = 0;
  34.     char    *ptr = string;
  35.     /* This implementation only works for decimal numbers. */
  36.     if (radix != 10)
  37.     {
  38.         *ptr = 0;
  39.         return string;
  40.     }

  41.     if (!value)
  42.     {
  43.         *ptr++ = 0x30;
  44.         *ptr = 0;
  45.         return string;
  46.     }

  47.     /* if this is a negative value insert the minus sign. */
  48.     if (value < 0)
  49.     {
  50.         *ptr++ = '-';

  51.         /* Make the value positive. */
  52.         value *= -1;
  53.     }

  54.     for (i = 10000; i > 0; i /= 10)
  55.     {
  56.         d = value / i;

  57.         if (d || flag)
  58.         {
  59.             *ptr++ = (char)(d + 0x30);
  60.             value -= (d * i);
  61.             flag = 1;
  62.         }
  63.     }

  64.     /* Null terminate the string. */
  65.     *ptr = 0;
  66.     return string;
  67. }
  68. void UART2_Printf(u8 *Data,...)
  69. {
  70.     const char *s;
  71.     int d;
  72.     char buf[16];
  73.     va_list ap;
  74.     va_start(ap, Data);

  75.         while(*Data!=0){                                                          //判断是否到达字符串结束符
  76.                 if(*Data==0x5c){                                                                          //'\'
  77.                         switch (*++Data){
  78.                                 case 'r':                                                                  //回车符
  79.                                         UART2_SendByte(0x0d);          

  80.                                         Data++;
  81.                                         break;
  82.                                 case 'n':                                                                  //换行符
  83.                                         UART2_SendByte(0x0a);       
  84.                                         Data++;
  85.                                         break;
  86.                                
  87.                                 default:
  88.                                         Data++;
  89.                                     break;
  90.                         }
  91.                        
  92.                          
  93.                 }
  94.                 else if(*Data=='%'){                                                                          //
  95.                         switch (*++Data){                               
  96.                                 case 's':                                                                                  //字符串
  97.                         s = va_arg(ap, const char *);
  98.                         for ( ; *s; s++) {
  99.                             UART2_SendByte(*s);
  100.                         }
  101.                                         Data++;
  102.                         break;
  103.                     case 'd':                                                                                  //十进制
  104.                         d = va_arg(ap, int);
  105.                         UART2_itoa(d, buf, 10);
  106.                         for (s = buf; *s; s++) {
  107.                             UART2_SendByte(*s);
  108.                         }
  109.                                         Data++;
  110.                         break;
  111.                                 default:
  112.                                         Data++;
  113.                                     break;
  114.                         }                 
  115.                 }
  116.                 else UART2_SendByte(*Data++);
  117.         }
  118. }
磨砂 发表于 2018-7-26 21:17 | 显示全部楼层
看起来怪怪的
观海 发表于 2018-7-26 21:29 | 显示全部楼层
貌似没什么问题
 楼主| yinxiangh 发表于 2018-7-26 22:38 | 显示全部楼层

嗯,我再好好缕一缕吧,有了好消息及时通知大家,结贴喽
jerow 发表于 2018-7-27 10:25 | 显示全部楼层
if( data1 == !data2),这句好像不对吧。不能这么比较
萧洛毫 发表于 2018-7-27 11:46 | 显示全部楼层
while(!(UART2->SR & 0x80));//数据发送到移位寄存器?
这句应该不需要写吧,直接写进DR寄存器就好了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

723

主题

7134

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

723

主题

7134

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部