打印
[STM8]

STM8 UART 求助

[复制链接]
4486|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wbsnty|  楼主 | 2014-6-18 20:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wbsnty 于 2014-6-24 20:58 编辑

刚学STM8,在做串口通信实验的时候遇到点问题,想请教各位!
操作寄存器的
功能描述:
     串口调试助手往MCU发送数据,MCU接到后再回发到串口调试助手上。
     MCU的UART_RX,UART_TX,已分别接到CP2102的T和R上
     写个测试程序,如果只是MCU往串口调试助手发送数据,PC上可以接受显示,但是当涉及到PC往MCU发送时,就不行了,调试了一个晚上还不行
    在调试过程中,串口调试助手也一直往MCU发送数据了,就是没发回。。
    请问是什么原因呢。。谢谢!!

    对寄存操作,不用库函数实现。
代码:
include "IOSTM8S103F3.h"
void Uart_Init(void)
{
  //设置波特率为9600,8个数据位,1个停止位,无奇偶验证
  UART1_CR1=0X00;
  UART1_CR2=0X00;
  UART1_CR3=0X00;
  UART1_BRR2=0X00;
  UART1_BRR1=0X0D;
  //允许接收,发送,开接收中断
  UART1_CR2=0X2C;
}
void IO_Uart()
{
   //初始化串口,PB5设置为推挽输出
   PB_DDR|=0X20;
   PB_CR1|=0X20;
   PB_CR2|=0X00;
   PB_ODR=0XF0;
}
void Uart1_Interrupt()
{
   unsigned char c;
   PB_ODR^=0X00; //测试进入中断标志,进入灯亮
   c = UART1_DR; // 接收到数据了
   while(!(UART1_SR & 0x20 == 1));
   UART1_DR = c; // 再发回去
}
int main( void )
{
    IO_Uart();
    Uart_Init();
    while(1)
    {
      if((UART1_SR | 0x40)==1)  //判断RXEN=1;
       {
        Uart1_Interrupt();
       }
    }
}



沙发
wbsnty|  楼主 | 2014-6-19 11:03 | 只看该作者
求指点。。。

使用特权

评论回复
板凳
拿起书本| | 2014-6-19 17:17 | 只看该作者
看下波特率设置是否正常,格式是否正确?

使用特权

评论回复
地板
way2888| | 2014-6-19 19:21 | 只看该作者
先读SR再读DR

使用特权

评论回复
5
电子云图| | 2014-6-21 09:20 | 只看该作者
发射中断和接受中断是分开来的
INTERRUPT_HANDLER(UART1_TX_IRQHandler, 17)
{
  /* Write one byte to the transmit data register */
  UART1_SendData8(TxBuffer[TxCounter++]);

  if (TxCounter == TX_BUFFER_SIZE)
  {
    /* Disable the USART Transmit Complete interrupt */
    UART1_ITConfig(UART1_IT_TXE, DISABLE);
  }
}

/**
  * @brief  UART1 RX Interrupt routine
  * @param  None
  * @retval None
  */
INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
{
  uint8_t temp;

  /* Read one byte from the receive data register and send it back */
  temp = (UART1_ReceiveData8() & 0x7F);
  UART1_SendData8(temp);
}

使用特权

评论回复
6
dami| | 2014-6-21 09:46 | 只看该作者
每次中断后要清标志吧。

使用特权

评论回复
7
wbsnty|  楼主 | 2014-6-24 20:58 | 只看该作者
拿起书本 发表于 2014-6-19 17:17
看下波特率设置是否正常,格式是否正确?

是一样的,做了标识,不知道为什么进不去中断

使用特权

评论回复
8
wbsnty|  楼主 | 2014-6-24 20:59 | 只看该作者
way2888 发表于 2014-6-19 19:21
先读SR再读DR

是啊。先判断 UART1_SR | 0x40)==1 //RXEN=1

使用特权

评论回复
9
wbsnty|  楼主 | 2014-6-24 21:00 | 只看该作者
电子云图 发表于 2014-6-21 09:20
发射中断和接受中断是分开来的
INTERRUPT_HANDLER(UART1_TX_IRQHandler, 17)
{

可以指点下,只操作寄存器的方法么?库函数不熟悉

使用特权

评论回复
10
wbsnty|  楼主 | 2014-6-24 21:00 | 只看该作者
dami 发表于 2014-6-21 09:46
每次中断后要清标志吧。

进不去中断~~~- -!

使用特权

评论回复
11
电子云图| | 2014-6-24 22:48 | 只看该作者
wbsnty 发表于 2014-6-24 21:00
可以指点下,只操作寄存器的方法么?库函数不熟悉

用库函数吧!现在我很少用寄存器了。

使用特权

评论回复
12
想做大牛的小马| | 2014-6-25 08:53 | 只看该作者
如果一定想自己写寄存器的话,可以先看看官方库函数是怎么写的,对照的搞搞。。。。~
额,看了一下你的程序,你这像是轮询,中断不是在主循环里调用的,是相应中断满足后,自动跳进去的哈

使用特权

评论回复
13
cuitjxg| | 2014-6-25 09:39 | 只看该作者
上传一个我的串口通信程序,中断接收串口的10个数据,再返回发送到上位,
9600bps
你参考下

DEMO.rar

373.01 KB

使用特权

评论回复
14
亿万嗣年| | 2015-8-31 17:01 | 只看该作者
wbsnty 发表于 2014-6-24 21:00
可以指点下,只操作寄存器的方法么?库函数不熟悉

不是40吧,是20

使用特权

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

本版积分规则

10

主题

46

帖子

0

粉丝