打印
[STM8]

哪位大神帮我看看这个程序为什么只执行while(1)循环,而没...

[复制链接]
3172|43
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
紫气东升|  楼主 | 2016-8-15 15:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 紫气东升 于 2016-9-7 13:31 编辑

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

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


/*********主函数********/
main()
{
  CLK_PCKENR1=0xff;
   CLK_CKDIVR=0x00;     //对HSI进行1分频(2MHZ/1=2MHZ)
   USART1_Init();          //通用串行接口USART1初始化
   GPIO_Init();             //GPIO端口初始化
   TIM3_Init();             //定时器初始化
   PD_DDR=0x03;         //设置PD端口为输出模式
   PD_CR1=0x03;         //设置PD端口为推挽输出
   PD_CR2=0x00;         //设置PD端口为低速输出
   _asm("rim");            //开总中断
    while(1)
    {
          PD_ODR=0x02;          //PD1(红)亮
          delay(65535);             //延时1s
          PD_ODR=0x00;         //PD1(红)灭
          delay(65535);            //延时1s
     }
               
}

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

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

  /*********TIM3初始化*********/
   void TIM3_Init(void)
    {
     TIM3_PSCR=0X03;      //预分频值2MHZ/(2^3)=250KHZ
     TIM3_ARR=25000;      //自动重载值,1/250k X 25000=0.1s
     TIM3_CNTR=25000;     //计数器初始值给12500
     TIM3_IER=0x01;       //开定时器中断
     TIM3_CR1=0x01;       //开始计时
    }

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

/******TIM3中断服务程序********/
@far @interrupt void TIM3_IRQHandler(void)
{
   
    if(!(USART1_SR & 0x80))                 //数据是否发送    {  
         USART1_DR=0xB6;                   //要发送的数据        
         if((USART1_SR & 0x20) ==0)    //发送是否完成
          {
              USART1_DR=0xB6;               //要接收的数据
             PD_ODR=0x01;                      //接收到数据PD0(黄)亮  
           }
    }  
    _asm("sim");                                    //结束总中断           
}

stm8_interrupt_vector.c中的程序,首先添加一句:
@far @interrupt extern void TIM3_IRQHandler(void);
然后修改
{0x82,NonHandledInterrupt},/*irp15*/

{0x82,TIM3_IRQHandler},/*irp15*/



沙发
yichunshan| | 2016-8-15 15:55 | 只看该作者
而没什么????

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
紫气东升 + 3
板凳
紫气东升|  楼主 | 2016-8-15 15:59 | 只看该作者
yichunshan 发表于 2016-8-15 15:55
而没什么????

而没有跳出循环,去执行中断程序

使用特权

评论回复
地板
玄德| | 2016-8-15 16:16 | 只看该作者

中断没有被触发。

要么是中断设置有问题,要么是条件没到。


使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
紫气东升 + 3
5
yichunshan| | 2016-8-15 16:19 | 只看该作者
紫气东升 发表于 2016-8-15 15:59
而没有跳出循环,去执行中断程序

你怎么判断没有进中断?

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
紫气东升 + 3
6
紫气东升|  楼主 | 2016-8-15 16:26 | 只看该作者
玄德 发表于 2016-8-15 16:16
中断没有被触发。

要么是中断设置有问题,要么是条件没到。

有没有可能是串口收发数据有问题,因为用调试助手只显示发送的数据(Tx),而接收数据端口(Rx)没反应。

使用特权

评论回复
7
紫气东升|  楼主 | 2016-8-15 17:10 | 只看该作者
yichunshan 发表于 2016-8-15 16:19
你怎么判断没有进中断?

因为红灯一直循环闪烁,输入数据进行中断没有任何反应。

使用特权

评论回复
8
yichunshan| | 2016-8-15 17:19 | 只看该作者
本帖最后由 yichunshan 于 2016-8-15 17:26 编辑
紫气东升 发表于 2016-8-15 17:10
因为红灯一直循环闪烁,输入数据进行中断没有任何反应。


使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
紫气东升 + 3
9
joyme| | 2016-8-15 17:22 | 只看该作者
  USART1_BRR2=0x0d;   //设置波特率为9600
  USART1_BRR1=0x00;
这两个寄存器反了,应该是 USART1_BRR1 = 0x0d; USART1_BRR2= 0;
程序也是写的很奇葩,在定时器中断了做串口,还有这么多的delay(),这个定时器的功能让你白白浪费了

使用特权

评论回复
10
joyme| | 2016-8-15 17:28 | 只看该作者
CLK_CKDIVR=0x07;     //对HSI进行128分频(16MHZ/128=125KHZ,0.008ms)
这句话意思应该是把主运行频率改为125K了,那么波特率算的是错的,9600 = 2M/0xd0,同样定时器的也是错的

使用特权

评论回复
11
紫气东升|  楼主 | 2016-8-15 18:45 | 只看该作者
joyme 发表于 2016-8-15 17:28
CLK_CKDIVR=0x07;     //对HSI进行128分频(16MHZ/128=125KHZ,0.008ms)
这句话意思应该是把主运行频率改为 ...

STM8S书本里是这么说的:当前系统主时钟频率是10MHZ,要设定的波特率是9600,则计算出来的值就是10000000/9600,约等于1024.将十进制数据1024转换为十六进制数据0412。因此,主频是10MHZ,设置波特率是9600时需要对寄存器UART3_BRR2和UART3_BRR1赋值的程序语句为:“UART3_BRR2=0x02;UART3_BRR1=0x41;"
现在我对HSI分频后频率变为125KHZ,我要设定波特率为9600,那么计算出来的值就是125000/9600,约等于13,转换为十六进制就是D。那么USART1_BRR2=0x0d;USART1_BRR1=0x00。请问哪里有错

使用特权

评论回复
12
Larm1| | 2016-8-15 19:00 | 只看该作者
检查定时器配置 程序,另外建议两点:
1. 不要在中断中使用while;
1. 不要在中断中使用delay或其他延时功能。

使用特权

评论回复
13
紫气东升|  楼主 | 2016-8-15 19:03 | 只看该作者
joyme 发表于 2016-8-15 17:22
USART1_BRR2=0x0d;   //设置波特率为9600
  USART1_BRR1=0x00;
这两个寄存器反了,应该是 USART1_BRR1 =  ...

我这个程序想要实现的功能是这样的:刚开始时一个红色LED灯不断闪烁(呼吸灯),当串口输入一个信号时红色LED灯灭,黄色LED灯闪烁,输入信号结束后,黄色LED灯灭,红色LED灯又开始不断闪烁(呼吸灯)。
要实现这样的功能你说流程应该是怎么样的?

使用特权

评论回复
14
紫气东升|  楼主 | 2016-8-15 19:12 | 只看该作者
Larm1 发表于 2016-8-15 19:00
检查定时器配置 程序,另外建议两点:
1. 不要在中断中使用while;
1. 不要在中断中使用delay或其他延时功能 ...

为什么呢,难道这样写不能实现功能?

使用特权

评论回复
15
datouyuan| | 2016-8-15 20:18 | 只看该作者
紫气东升 发表于 2016-8-15 19:12
为什么呢,难道这样写不能实现功能?

这样些就是不好.
你要添加些功能,要修改整个程序框架,太麻烦了.

使用特权

评论回复
16
energyplants| | 2016-8-15 21:07 | 只看该作者
不知道你的中断是靠什么响应的,应该是初始化程序不对

使用特权

评论回复
17
紫气东升|  楼主 | 2016-8-16 08:42 | 只看该作者
energyplants 发表于 2016-8-15 21:07
不知道你的中断是靠什么响应的,应该是初始化程序不对

靠输入信号响应

使用特权

评论回复
18
Mr大风车| | 2016-8-16 09:37 | 只看该作者
紫气东升 发表于 2016-8-15 19:03
我这个程序想要实现的功能是这样的:刚开始时一个红色LED灯不断闪烁(呼吸灯),当串口输入一个信号时红 ...

你想用TIM3定时检测有没有数据输入?为什么不直接用USART1的中断呢,你这不是USART中断,是TIM3的中断,你输入数据当然不会产生中断。

使用特权

评论回复
19
紫气东升|  楼主 | 2016-8-16 09:50 | 只看该作者
Mr大风车 发表于 2016-8-16 09:37
你想用TIM3定时检测有没有数据输入?为什么不直接用USART1的中断呢,你这不是USART中断,是TIM3的中断,你 ...

USART没有中断功能

使用特权

评论回复
20
yichunshan| | 2016-8-16 10:43 | 只看该作者
你波特率寄存器设置有问题,USART1_BRR1寄存器值不能为0,也就是说,USART_DIV值不能小于16

使用特权

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

本版积分规则

17

主题

97

帖子

0

粉丝