8107|15

14

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

STM8L串口收发 [复制链接]

 
1芯积分
本帖最后由 ziqidongsheng 于 2016-9-2 11:14 编辑

这是我用寄存器写的程序,但是实现不了功能,有哪位大神会的请指教,谢谢
#include
#include

/*********函数声明********/
void delay(unsigned int time);

/******USART初始化*********/
void USART1_Init(void)
{
    CLK_PCKENR1 =0x0f;
    USART1_CR1=0x00;          //设置M字长,8位数据位
    USART1_CR2=0x2c;          //使能发送、接收;
    USART1_CR3=0x00;         //1位停止位
    USART1_BRR2=0x03;       //设置波特率为9600
    USART1_BRR1=0x68;
}

void Uart_SendData(unsigned char  data)
{
  while(!(USART1_SR&0X80));       //判断发送数据寄存器是否为空
  USART1_DR = data;                  //向发送寄存器写入数据  
}

/*********IO初始化*********/
void IO_Init(void)
{
   PD_ODR=0x03;               //初始使小灯全灭
   PD_DDR=0x03;              //设置PD端口为输出模式
   PD_CR1=0x03;               //设置PD端口为推挽输出
   PD_CR2=0x00;               //设置PD端口为低速输出
}

/*********主函数********/
void main(void)
{
   _asm("sim");                  //关总中断
     USART1_Init();            //通用串行接口USART1初始化
   IO_Init();                       //GPIO端口初始化
   CLK_CKDIVR=0x00;     //系统HSI时钟1分频
     _asm("rim");               //开总中断
   while(1)
   {
     PD_ODR=0x02;         //PD1(红)亮
     delay(65535);            //延时1s
     PD_ODR=0x00;         //PD1(红)灭
     delay(65535);            //延时1s
    }
}

/******中断服务程序********/
#pragma vector = USART_R_RXNE_vector
@far @interrupt void USART1_Rx_IRQHandler(void)
{
    unsigned char ch1;
     if(USART1_SR =0x20)    //发送是否完成
      {
            ch1 = USART1_DR;
            Uart_SendData(ch1);
       }
     
}

/********延时函数**********/
void delay(unsigned int time)
{
   while(time--);
}

中断函数修改:
/*    BASIC INTERRUPT VECTOR TABLE FOR STM8 devices
*    Copyright (c) 2007 STMicroelectronics
*/

typedef void @far (*interrupt_handler_t)(void);

struct interrupt_vector {
    unsigned char interrupt_instruction;
    interrupt_handler_t interrupt_handler;
};

@far @interrupt void NonHandledInterrupt (void)
{
    /* in order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction
    */
    return;
}

extern void _stext();     /* startup routine */
@far @interrupt void USART1_Rx_IRQHandler(void);
struct interrupt_vector const _vectab[] = {
    {0x82, (interrupt_handler_t)_stext}, /* reset */
    {0x82, NonHandledInterrupt}, /* trap  */
    {0x82, NonHandledInterrupt}, /* irq0  */
    {0x82, NonHandledInterrupt}, /* irq1  */
    {0x82, NonHandledInterrupt}, /* irq2  */
    {0x82, NonHandledInterrupt}, /* irq3  */
    {0x82, NonHandledInterrupt}, /* irq4  */
    {0x82, NonHandledInterrupt}, /* irq5  */
    {0x82, NonHandledInterrupt}, /* irq6  */
    {0x82, NonHandledInterrupt}, /* irq7  */
    {0x82, NonHandledInterrupt}, /* irq8  */
    {0x82, NonHandledInterrupt}, /* irq9  */
    {0x82, NonHandledInterrupt}, /* irq10 */
    {0x82, NonHandledInterrupt}, /* irq11 */
    {0x82, NonHandledInterrupt}, /* irq12 */
    {0x82, NonHandledInterrupt}, /* irq13 */
    {0x82, NonHandledInterrupt}, /* irq14 */
    {0x82, NonHandledInterrupt}, /* irq15 */
    {0x82, NonHandledInterrupt}, /* irq16 */
    {0x82, NonHandledInterrupt}, /* irq17 */
    {0x82, NonHandledInterrupt}, /* irq18 */
    {0x82, NonHandledInterrupt}, /* irq19 */
    {0x82, NonHandledInterrupt}, /* irq20 */
    {0x82, NonHandledInterrupt}, /* irq21 */
    {0x82, NonHandledInterrupt}, /* irq22 */
    {0x82, NonHandledInterrupt}, /* irq23 */
    {0x82, NonHandledInterrupt}, /* irq24 */
    {0x82, NonHandledInterrupt}, /* irq25 */
    {0x82, NonHandledInterrupt}, /* irq26 */
    {0x82, NonHandledInterrupt}, /* irq27 */
    {0x82, USART1_Rx_IRQHandler}, /* irq28 */
    {0x82, NonHandledInterrupt}, /* irq29 */
};

想要实现的功能是这样的:上电后呼吸灯不断循环闪烁,当通过串口助手发送数据时进入中断,呼吸灯不再闪烁,同时串口助手也显示反馈回来的发送数据,收发完毕后又返回主函数(呼吸灯继续闪烁)。


此帖出自stm32/stm8论坛

最新回复

1,没看到接收中断,或者接收缓冲,或者接收数据之后的处理过程。 2,main 里 while(1){}//这怎么实现停止,至少加写东西,收到电脑发来什么,之后停止工作什么的。 3,似乎void Uart_SendData(unsigned char  data) 和@far @interrupt void USART1_Rx_IRQHandler(void) 里面的内容全是关于发送数据的。但未见发送的执行语句。   详情 回复 发表于 2016-9-8 18:30
点赞 关注
 

回复
举报

14

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
请各位大神帮帮忙啊,我都搞了一个月了没搞出来,救救我这个菜鸟吧
此帖出自stm32/stm8论坛
 
 

回复

732

帖子

2

TA的资源

纯净的硅(中级)

板凳
 
至少说一下现在这个程序是什么现象吧
此帖出自stm32/stm8论坛
 
个人签名亚里士缺德
 

回复

503

帖子

1

TA的资源

纯净的硅(初级)

4
 
unsigned char ch1;
     if(USART1_SR =0x20)    //发送是否完成
      {
            ch1 = USART1_DR;
            Uart_SendData(ch1);
       }
STM8L没用过 单看程序  if里少个等号    if(0x20==USART1_SR)这样写 少写个等号会报错
此帖出自stm32/stm8论坛
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

5
 
汤权 发表于 2016-9-2 11:33
至少说一下现在这个程序是什么现象吧

就是用串口助手发送数据没有反应
此帖出自stm32/stm8论坛
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

6
 
ddlxiaoxu 发表于 2016-9-2 11:36
unsigned char ch1;
     if(USART1_SR =0x20)    //发送是否完成
      {
            ch1 = USART1_DR ...

我这个编译没出错啊
此帖出自stm32/stm8论坛

点评

这个是正确的语法,不会报错的,你这种写法是对的但是程序原来的意思错了,但是这不是影响接收不到数据的原因,因为这个if语句会永远正确,所以接收不到可能是你的串口中断没有打开,或者中断屏蔽了,我在你的串口初  详情 回复 发表于 2016-9-2 12:50
 
 
 

回复

732

帖子

2

TA的资源

纯净的硅(中级)

7
 
ziqidongsheng 发表于 2016-9-2 11:40
我这个编译没出错啊

这个是正确的语法,不会报错的,你这种写法是对的但是程序原来的意思错了,但是这不是影响接收不到数据的原因,因为这个if语句会永远正确,所以接收不到可能是你的串口中断没有打开,或者中断屏蔽了,我在你的串口初始化里面并没有看见中断打开的地方。。。。
此帖出自stm32/stm8论坛
 
个人签名亚里士缺德
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

8
 
汤权 发表于 2016-9-2 12:50
这个是正确的语法,不会报错的,你这种写法是对的但是程序原来的意思错了,但是这不是影响接收不到数据的 ...

那应该怎么打开,我只知道这样设置,其他我不会,大神你教教我吧应该添加什么上去开中断
此帖出自stm32/stm8论坛
 
 
 

回复

732

帖子

2

TA的资源

纯净的硅(中级)

9
 
要自己看手册的这种东西,我帮你看一次,我也没弄过STM8其实。。。。如下图:

捕获.PNG (130.97 KB, 下载次数: 0)

设置这位

设置这位
此帖出自stm32/stm8论坛
 
个人签名亚里士缺德
 
 

回复

732

帖子

2

TA的资源

纯净的硅(中级)

10
 
程序上是:UART_CR2 |= (1<<5);   把这句话加到串口初始化里面去。
此帖出自stm32/stm8论坛
 
个人签名亚里士缺德
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

11
 
汤权 发表于 2016-9-2 12:50
这个是正确的语法,不会报错的,你这种写法是对的但是程序原来的意思错了,但是这不是影响接收不到数据的 ...

刚刚我看了,有串口中断。我这个USART1_CR2=0x2c;分开来写就是:
USART1_CR2=0x08;    //发送使能 (USART1_CR2_TEN=0x08;)
USART1_CR2=0x04;    //接收使能(USART1_CR2_REN=0x04;)
USART1_CR2=0x80;   //发送中断使能(USART1_CR2_TIEN=0x80;)
USART1_CR2=0x20;   //接收中断使能(USART1_CR2_RIEN=0x20;)
此帖出自stm32/stm8论坛

点评

不是的,你这样写USART1_CR2的值最终是0x20,而不是0x2c,C语言基础这是,改成: USART1_CR2 |= 0x08; //发送使能 (USART1_CR2_TEN=0x08;) USART1_CR2 |= 0x04; //接收使能(USART1_CR2_REN=0x04;) USAR  详情 回复 发表于 2016-9-2 15:07
 
 
 

回复

732

帖子

2

TA的资源

纯净的硅(中级)

12
 
ziqidongsheng 发表于 2016-9-2 14:43
刚刚我看了,有串口中断。我这个USART1_CR2=0x2c;分开来写就是:
USART1_CR2=0x08;    //发送使能 (USA ...

不是的,你这样写USART1_CR2的值最终是0x20,而不是0x2c,C语言基础这是,改成:
USART1_CR2 |= 0x08;    //发送使能 (USART1_CR2_TEN=0x08;)
USART1_CR2 |= 0x04;    //接收使能(USART1_CR2_REN=0x04;)
USART1_CR2 |= 0x80;   //发送中断使能(USART1_CR2_TIEN=0x80;)
USART1_CR2 |= 0x20;   //接收中断使能(USART1_CR2_RIEN=0x20;)
此帖出自stm32/stm8论坛
 
个人签名亚里士缺德
 
 

回复

732

帖子

2

TA的资源

纯净的硅(中级)

13
 
嗯,的确是有使能中断,那这样我就不知道怎么回事了,stm8我并不了解的。。。
此帖出自stm32/stm8论坛
 
个人签名亚里士缺德
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

14
 
有哪位会的,求解
此帖出自stm32/stm8论坛
 
 
 

回复

229

帖子

0

TA的资源

纯净的硅(高级)

15
 
1,没看到接收中断,或者接收缓冲,或者接收数据之后的处理过程。
2,main 里 while(1){}//这怎么实现停止,至少加写东西,收到电脑发来什么,之后停止工作什么的。
3,似乎void Uart_SendData(unsigned char  data)
@far @interrupt void USART1_Rx_IRQHandler(void)
里面的内容全是关于发送数据的。但未见发送的执行语句。
此帖出自stm32/stm8论坛

点评

这个太难搞了,我先放一放,过段时间再弄,现在弄个简单点的  详情 回复 发表于 2016-9-9 08:51
 
个人签名作人随心、做事随缘。世间凡事岂能尽如人意。不求无怨无悔、但求无愧于心。
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

16
 
single 发表于 2016-9-8 18:30
1,没看到接收中断,或者接收缓冲,或者接收数据之后的处理过程。
2,main 里 while(1){}//这怎么实现停 ...

这个太难搞了,我先放一放,过段时间再弄,现在弄个简单点的
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表