OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4949|回复: 19

寄存器操作STM8L串口中断

[复制链接]

53

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
839
金钱
839
注册时间
2016-8-23
在线时间
116 小时
发表于 2016-8-23 09:59:03 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 紫气东升 于 2016-8-25 08:16 编辑

#include <stm8l052c6.h>
#include <stdio.h>

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

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

    /*********CLK初始化*********/
    void CLK_Init(void)
        {
      CLK_CKDIVR=0x03;    //对HSI进8分频16MHZ/8=2MHZ
            
        }

    /******USART1初始化*********/
   void USART1_Init(void)
      {
     USART1_CR1=0x00;    //设置字长,8位数据位
     USART1_CR2=0x0c;    //使能发送、接收;
     USART1_CR3=0x00;    //1位停止位
     USART1_BRR2=0x00;   //2MHZ时钟下9600波特率
     USART1_BRR1=0x0d;
         //USART1_SR=0x40;     //TC位置1
      }

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

/******中断服务程序********/
@far @interrupt void USART_Rx_IRQHandler(void)
  {
   if((USART1_SR & 0x20)==0)         
    {                        
         USART1_DR=0xB6;            
         PD_ODR=0x01;
      }   
        if((USART1_SR & 0x60)==0)         
    {                        
         USART1_DR=0xB6;            
      }   
  }        

/********延时函数**********/
void delay(unsigned int time)
{
   while(time--);
}
这是我用寄存器写的程序,想搞个串口中断的,没想到怎么试都不成功,有哪位高手会的请教教我,不胜感激!

最佳答案

查看完整内容[请看2#楼]

[mw_shl_code=applescript,true]void init_uart(void) { _asm("rim"); CLK_PCKENR1 |= SETBIT2; //fMASTER to peripheral enabled--UART1 UART1_CR2 &= CLRBIT2; //Receiver is disabled UART1_CR2 &= CLRBIT3; //Transmitter is disabl ...
天道酬勤
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
226
金钱
226
注册时间
2015-10-8
在线时间
41 小时
发表于 2016-8-23 09:59:04 | 显示全部楼层
本帖最后由 sunyou26 于 2016-8-25 10:55 编辑

[mw_shl_code=applescript,true]void init_uart(void)
{
        _asm("rim");
        
        CLK_PCKENR1 |= SETBIT2;                                      //fMASTER to peripheral enabled--UART1
        UART1_CR2 &= CLRBIT2;                                                                 //Receiver is disabled
        UART1_CR2 &= CLRBIT3;                                  //Transmitter is disabled
        UART1_BRR2 = 0x1b;                                                                        //Baud rate register 2   2400=0x1b   9600=0x03
        UART1_BRR1 = 0xa0;                                                                        //Baud rate register 1   2400=0xa0   9600=0x68
        UART1_CR3 &= CLRBIT4;                                                                //1 Stop bit
        UART1_CR3 &= CLRBIT5;                                                                //1 Stop bit
        UART1_CR1 &= CLRBIT2;                                                                //Parity control disabled
        UART1_CR1 &= CLRBIT4;                                                                //1 Start bit, 8 Data bits, 1 Stop bit
        UART1_CR2 &= CLRBIT6;                                                                //Interrupt is inhibited
        UART1_CR2 |= SETBIT5;                                                                //An UART interrupt is generated whenever OR=1 or RXNE=1 in the UART_SR register
        UART1_CR1 &= CLRBIT5;                                                                //UART enabled
        UART1_CR2 |= SETBIT2;                                                                //Receiver is enabled and begins searching for a start bit
        UART1_CR2 |= SETBIT3;                                                                //Transmitter is enabled
}  
@far @interrupt void UART_Rx_Interrupt(void)
{
   unsigned char temp[5] = {0x01, 0x02, 0x03, 0x04};
         char i;
         
         temp[4] = UART1_DR;
         PA_ODR &= CLRBIT3;
         for(i = 0; i < 5; i++)
         {
                  while((UART1_SR & CHSBIT7) == 0x00);  //wait for data transfers to shift register
                        UART1_DR = temp;
         }
         while((UART1_SR & CHSBIT6) == 0x00);                        //wait for transmit complete
         PA_ODR |= SETBIT3;                                                                                   //note: TC bit is set 1 after reset,it is clear by a software sequence
                                                                                                                                                //(a read to the UART_SR register followed by a write to the UART_DR register)
}
[/mw_shl_code]
收到什么回发什么,你自己看看吧  

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-8-24 21:37:04 | 显示全部楼层
帮顶.
回复

使用道具 举报

53

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
839
金钱
839
注册时间
2016-8-23
在线时间
116 小时
 楼主| 发表于 2016-8-25 08:18:15 | 显示全部楼层

原子哥,求助。这个我已经搞了差不多三周了还没好,好焦急啊
天道酬勤
回复

使用道具 举报

53

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
839
金钱
839
注册时间
2016-8-23
在线时间
116 小时
 楼主| 发表于 2016-8-25 14:25:25 | 显示全部楼层
sunyou26 发表于 2016-8-25 10:52
[mw_shl_code=applescript,true]void init_uart(void)
{
        _asm("rim");

非常感谢,非常感谢,非常感谢,(重要的事要说三遍),要是实现了你就是我的救命恩人了
天道酬勤
回复

使用道具 举报

22

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
226
金钱
226
注册时间
2015-10-8
在线时间
41 小时
发表于 2016-8-25 14:37:48 | 显示全部楼层
紫气东升 发表于 2016-8-25 14:25
非常感谢,非常感谢,非常感谢,(重要的事要说三遍),要是实现了你就是我的救命恩人了

我用内部时钟,而且没分频,波特率设置你注意下,在串口中断里面将收到的数据放在数组【4】  在电脑上发送FF,会回收到01 02 03 04 FF
回复

使用道具 举报

53

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
839
金钱
839
注册时间
2016-8-23
在线时间
116 小时
 楼主| 发表于 2016-8-25 14:44:09 | 显示全部楼层
sunyou26 发表于 2016-8-25 14:37
我用内部时钟,而且没分频,波特率设置你注意下,在串口中断里面将收到的数据放在数组【4】  在电脑上发 ...

谢谢指导。
天道酬勤
回复

使用道具 举报

53

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
839
金钱
839
注册时间
2016-8-23
在线时间
116 小时
 楼主| 发表于 2016-8-25 15:01:35 | 显示全部楼层
sunyou26 发表于 2016-8-25 10:52
[mw_shl_code=applescript,true]void init_uart(void)
{
        _asm("rim");

大神我想请教一下,CLRBIT4,SETBIT5,SETBIT2这些是什么意思啊?为什么有重复的CR1,CR2,CR3,只要一个可以吗?
天道酬勤
回复

使用道具 举报

22

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
226
金钱
226
注册时间
2015-10-8
在线时间
41 小时
发表于 2016-8-25 15:15:28 | 显示全部楼层
本帖最后由 sunyou26 于 2016-8-25 15:17 编辑

CLRBIT和SETBIT是头文件定义 ProHead.rar (1.05 KB, 下载次数: 245)
回复

使用道具 举报

53

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
839
金钱
839
注册时间
2016-8-23
在线时间
116 小时
 楼主| 发表于 2016-8-25 15:46:36 | 显示全部楼层
sunyou26 发表于 2016-8-25 15:15
CLRBIT和SETBIT是头文件定义
就是置某一位,清除某一位的意思

我将CLRBIT和SETBIT改成0x80这种形式可以吗?因为不改的话编译会出错:
#error cpstm8 main.c:16(17+7) SETBIT5 undefined
#error cpstm8 main.c:15(17+7) CLRBIT6 undefined
出现这些提示
天道酬勤
回复

使用道具 举报

22

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
226
金钱
226
注册时间
2015-10-8
在线时间
41 小时
发表于 2016-8-25 16:09:25 | 显示全部楼层
紫气东升 发表于 2016-8-25 15:46
我将CLRBIT和SETBIT改成0x80这种形式可以吗?因为不改的话编译会出错:
#error cpstm8 main.c:16(17+7)  ...

你添加Prohead.h头文件就可以了
回复

使用道具 举报

53

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
839
金钱
839
注册时间
2016-8-23
在线时间
116 小时
 楼主| 发表于 2016-8-25 16:58:56 | 显示全部楼层
sunyou26 发表于 2016-8-25 16:09
你添加Prohead.h头文件就可以了

main()函数没有定义,main()里面应该写什么上去呢?
我太笨了,什么也不会
天道酬勤
回复

使用道具 举报

22

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
226
金钱
226
注册时间
2015-10-8
在线时间
41 小时
发表于 2016-8-25 17:01:13 | 显示全部楼层
紫气东升 发表于 2016-8-25 16:58
main()函数没有定义,main()里面应该写什么上去呢?
我太笨了,什么也不会

你不是用STVD写的吗?   int main(void)
回复

使用道具 举报

53

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
839
金钱
839
注册时间
2016-8-23
在线时间
116 小时
 楼主| 发表于 2016-8-25 17:05:05 | 显示全部楼层
sunyou26 发表于 2016-8-25 17:01
你不是用STVD写的吗?   int main(void)

是啊,我是说
main()
{
  这里应该写什么上去
}
天道酬勤
回复

使用道具 举报

22

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
226
金钱
226
注册时间
2015-10-8
在线时间
41 小时
发表于 2016-8-25 17:11:20 | 显示全部楼层
紫气东升 发表于 2016-8-25 17:05
是啊,我是说
main()
{

你原来的程序是什么就写什么
回复

使用道具 举报

53

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
839
金钱
839
注册时间
2016-8-23
在线时间
116 小时
 楼主| 发表于 2016-8-26 08:12:12 | 显示全部楼层
sunyou26 发表于 2016-8-25 17:11
你原来的程序是什么就写什么

大神,还是不得怎么办
天道酬勤
回复

使用道具 举报

53

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
839
金钱
839
注册时间
2016-8-23
在线时间
116 小时
 楼主| 发表于 2016-8-29 15:52:19 | 显示全部楼层
有没有大神会啊,请帮帮忙求解
天道酬勤
回复

使用道具 举报

22

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
226
金钱
226
注册时间
2015-10-8
在线时间
41 小时
发表于 2016-8-29 22:45:11 | 显示全部楼层
紫气东升 发表于 2016-8-26 08:12
大神,还是不得怎么办

中断C文件添加了串口中断函数没有?
回复

使用道具 举报

53

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
839
金钱
839
注册时间
2016-8-23
在线时间
116 小时
 楼主| 发表于 2016-8-30 14:20:16 | 显示全部楼层
sunyou26 发表于 2016-8-29 22:45
中断C文件添加了串口中断函数没有?

添加了,要是不添加的话编译会出错的。
天道酬勤
回复

使用道具 举报

53

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
839
金钱
839
注册时间
2016-8-23
在线时间
116 小时
 楼主| 发表于 2016-8-30 14:21:45 | 显示全部楼层
该设置的都设置好了,为什么就是不成功
天道酬勤
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 05:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表