打印
[STM8]

按下面这样发送可以吗?

[复制链接]
586|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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");
}

使用特权

评论回复
5
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;
}
}

使用特权

评论回复
6
xxrs| | 2018-7-26 20:17 | 只看该作者
为什么不判断接收的状态位呢?

使用特权

评论回复
7
幸福小强| | 2018-7-26 20:38 | 只看该作者
#include"stm8s.h"
#include"stm8s_conf.h"
#include"UART2.h"
#include"stdarg.h"

void    UART2_Config(u32 Rate)
{
      CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1,     ENABLE);
      GPIO_Init(UART2_PORT,    TX2_PIN,     GPIO_MODE_OUT_PP_LOW_FAST);
      GPIO_Init(UART2_PORT,    RX2_PIN,     GPIO_MODE_IN_PU_NO_IT);
      UART2_Init(Rate, UART2_WORDLENGTH_8D, UART2_STOPBITS_1, UART2_PARITY_NO, UART2_SYNCMODE_CLOCK_DISABLE, UART2_MODE_TXRX_ENABLE);
      UART2_ITConfig(UART2_IT_RXNE_OR,ENABLE);
      UART2_Cmd(ENABLE);
}

void    UART2_SendByte(u8 Byte)
{
      while(!(UART2->SR & TC));
      UART2->DR = Byte;
}

#pragma vector =ITC_IRQ_UART2_RX + 2
__interrupt void   UART2_IRQHandler(void)
{
    u8  Temp;
    if(UART2->SR & UART2_SR_RXNE)
    {
       Temp  =UART2->DR;
       UART2->SR = ~UART2_SR_RXNE;
       UART2_SendByte(Temp);
    }   
}

char   * UART2_itoa(int value, char *string, int radix)
{
    int     i, d;
    int     flag = 0;
    char    *ptr = string;
    /* This implementation only works for decimal numbers. */
    if (radix != 10)
    {
        *ptr = 0;
        return string;
    }

    if (!value)
    {
        *ptr++ = 0x30;
        *ptr = 0;
        return string;
    }

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

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

    for (i = 10000; i > 0; i /= 10)
    {
        d = value / i;

        if (d || flag)
        {
            *ptr++ = (char)(d + 0x30);
            value -= (d * i);
            flag = 1;
        }
    }

    /* Null terminate the string. */
    *ptr = 0;
    return string;
}
void UART2_Printf(u8 *Data,...)
{
    const char *s;
    int d;
    char buf[16];
    va_list ap;
    va_start(ap, Data);

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

                                        Data++;
                                        break;
                                case 'n':                                                                  //换行符
                                        UART2_SendByte(0x0a);       
                                        Data++;
                                        break;
                               
                                default:
                                        Data++;
                                    break;
                        }
                       
                         
                }
                else if(*Data=='%'){                                                                          //
                        switch (*++Data){                               
                                case 's':                                                                                  //字符串
                        s = va_arg(ap, const char *);
                        for ( ; *s; s++) {
                            UART2_SendByte(*s);
                        }
                                        Data++;
                        break;
                    case 'd':                                                                                  //十进制
                        d = va_arg(ap, int);
                        UART2_itoa(d, buf, 10);
                        for (s = buf; *s; s++) {
                            UART2_SendByte(*s);
                        }
                                        Data++;
                        break;
                                default:
                                        Data++;
                                    break;
                        }                 
                }
                else UART2_SendByte(*Data++);
        }
}

使用特权

评论回复
8
磨砂| | 2018-7-26 21:17 | 只看该作者
看起来怪怪的

使用特权

评论回复
9
观海| | 2018-7-26 21:29 | 只看该作者
貌似没什么问题

使用特权

评论回复
10
yinxiangh|  楼主 | 2018-7-26 22:38 | 只看该作者

嗯,我再好好缕一缕吧,有了好消息及时通知大家,结贴喽

使用特权

评论回复
11
jerow| | 2018-7-27 10:25 | 只看该作者
if( data1 == !data2),这句好像不对吧。不能这么比较

使用特权

评论回复
12
萧洛毫| | 2018-7-27 11:46 | 只看该作者
while(!(UART2->SR & 0x80));//数据发送到移位寄存器?
这句应该不需要写吧,直接写进DR寄存器就好了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

723

主题

7134

帖子

2

粉丝