搜索
ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU

[STM8] STM8S003 UART寄存器值修改不了

[复制链接]
45|19
 楼主 | 2020-11-3 21:33 | 显示全部楼层 |阅读模式
用STM8S003K3进行串口通讯,运行串口初始化程序后,在STVP开发环境中观察外设寄存器值并没有改变

使用特权

评论回复
| 2020-11-3 21:37 | 显示全部楼层

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
 楼主 | 2020-11-3 21:38 | 显示全部楼层
串口初始化程序如下:
void USART1_Config(void)
{
        UART1_CR2 = 0;  //禁止UART发送和接收
        UART1_CR1 = 0x01; //设置M字长,8位数据位
        UART1_CR3=0x00;  //    1 stop bit

        UART1_BRR2=0x00;//00-0d:9600(fcpu=fmaster=2MHz)
        UART1_BRR1=0x0d;

        UART1_CR2 = 0x0C;  //bit3=1,允许发送   bit2=1,允许接收
}



而我运行定时器初始化函数后,在STVP开发环境中观察外设寄存器值就是我写入的值,定时器初始化函数如下:
void Timer2Init(void)
{
        TIM2_IER = 0x00;   //禁止中断
        TIM2_EGR = 0x01;  //允许产生更新事件
        TIM2_PSCR = 0x01;         //计时器时钟=主时钟/2=2Mhz/2  相当于计数器周期为1μs
        TIM2_ARRH = 0x03; // 设定重装载时的寄存器值
        TIM2_ARRL = 0xe8;
        TIM2_CNTRH = 0x03; //设定计数器的初值
        TIM2_CNTRL = 0xe8;   //   定时周期=1000*1μs=1ms
        TIM2_CR1 = 0x01;    //b1=1,允许计数器工作b1=0,允许更新,设置控制器,启动定时器
        TIM2_IER = 0x01;  //允许更新中断
}

从程序运行结果来看,定时器可以正常工作,串口不行,是不是我串口初始化没有成功?为什么串口初始化不成功?跟时钟配置有关系吗?以下是我时钟配置函数:

void McuInit(void)
{
        CLK_SWR=0xE1;        //        选择芯片内部的16MHz的RC振荡器为主时钟
        CLK_CKDIVR=0x18; //CPU时钟=16M/8
        _asm("NOP");
        _asm("NOP");
        _asm("NOP");
        CLK_PCKENR1=0x24; //Tim2,UART1外设时钟使能
        CLK_PCKENR2=0x00;
}

以下是UART1 IO 口配置
void Uart1_IOConfig(void)
{  
        PD_DDR |= (1<<5);//         TXD  输出模式
        PD_CR1 |= (1<<5);// 推挽输出
        PD_CR2&=~(1<<5);

        PD_DDR &=~(1<<6);//RXD 输入模式
        PD_CR1 &=~(1<<6);//浮空输入
}  

使用特权

评论回复
 楼主 | 2020-11-3 21:42 | 显示全部楼层
串口初始化时,并没有打开串口中断,当我扫描到按键时,打开串口中断,把一串数据放在数组中发送出去,经调试发现,程序可以进入发送中断,发送第一个字节数据,但是我用示波器观察TXD引脚,并没有波形输出。

使用特权

评论回复
| 2020-11-3 21:46 | 显示全部楼层

还有什么现象?能再详细描述下吗?

使用特权

评论回复
 楼主 | 2020-11-3 21:50 | 显示全部楼层
而且假如我要发送10个字节数据,这些数据存放在发送数组中,发送数组第一个元素存放要发送字节数,每次进入发送中断后,数组指针加一,直到数组发送完成,经调试发现,程序虽然可以进入一次发送中断,可是我把断点设置在一串数据(假设10个字节)发送完成处,发现程序并不会在断点处停下来,这样,是不是意味着我的中断只进入一次,只发送第一字节数据,可是为什么TXD脚没有波形输出?

使用特权

评论回复
 楼主 | 2020-11-3 21:54 | 显示全部楼层
中断函数:

@far @interrupt void UART1_TX_IRQHandler (void)
{
       if(UART1_SR & (1<<6))
      {
              UART1_SR&= ~(1<<6);
              vUSART1Send();
      }
      return;
}


void vUSART1Send(void)
{
        Gu8HMISend_Data=Gu8HMISend_Buffer[Gu8HMISend_Num] ;   //从发送数组中取要发送的数据
        UART1_DR=Gu8HMISend_Data;
        Gu8HMISend_Num++;    //如果我把断点设在这里,程序可以停在这儿,TXD脚却没有波形输出
                                             //发送数组指针加1
        if(Gu8HMISend_Num>Gu8HMISend_Buffer[0])//发送已经完成  
                                                                        //Gu8HMISend_Buffer[0]里面存放的是 要发送的字节数
        {
               Gu8HMISend_Buffer[0]=0;   //如果我把断点设在这里,程序不会停在这儿
                Gu8HMIRcv_Num=0;
                Gu8HMISend_Num=1;
                vUsart1Enable(TRUE,FALSE);
        }
}

使用特权

评论回复
 楼主 | 2020-11-3 21:57 | 显示全部楼层

使用特权

评论回复
 楼主 | 2020-11-3 22:03 | 显示全部楼层
483495fa1633f8af94.png

使用特权

评论回复
| 2020-11-3 22:07 | 显示全部楼层
串口的例程,官方肯定提供了,直接copy使用就好了

使用特权

评论回复
| 2020-11-3 22:12 | 显示全部楼层
至于有没有发出去,最简单,开个串口上位机看看有没有接收不就好了

使用特权

评论回复
 楼主 | 2020-11-3 22:17 | 显示全部楼层
是不是要先经过RS232电平转换,再接计算机COM口,然后打开串口调试助手看看数据有没有发出?

使用特权

评论回复
| 2020-11-3 22:21 | 显示全部楼层
对,接个usb转TTL的模块就好了。

使用特权

评论回复
| 2020-11-3 22:31 | 显示全部楼层
解决了吗  我也是写不进去 XDD

使用特权

评论回复
| 2020-11-3 22:36 | 显示全部楼层
我找到问题了 时钟配置问题 XD 自问自答了

使用特权

评论回复
| 2020-11-3 22:45 | 显示全部楼层
我的stm8s.h里面 定义的UART1 的CLK竟然是0x04
datasheet里面明明写的是0x08

使用特权

评论回复
| 2020-11-3 22:49 | 显示全部楼层
174175fa16de0ca6fd.png

使用特权

评论回复
| 2020-11-3 22:52 | 显示全部楼层
336165fa16ea00e3c6.png

使用特权

评论回复
 楼主 | 2020-11-3 22:57 | 显示全部楼层

嗯,预料中的结果,多谢大家啦

使用特权

评论回复
| 2020-11-10 22:29 | 显示全部楼层
zyf部长 发表于 2020-11-3 22:57
嗯,预料中的结果,多谢大家啦

你好,我学STM8遇到一些问题能加个好友吗?

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

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