打印
[STM8]

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

[复制链接]
2627|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*/



沙发
紫气东升|  楼主 | 2016-8-15 15:59 | 显示全部楼层
yichunshan 发表于 2016-8-15 15:55
而没什么????

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

使用特权

评论回复
板凳
紫气东升|  楼主 | 2016-8-15 16:26 | 显示全部楼层
玄德 发表于 2016-8-15 16:16
中断没有被触发。

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

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

使用特权

评论回复
地板
紫气东升|  楼主 | 2016-8-15 17:10 | 显示全部楼层
yichunshan 发表于 2016-8-15 16:19
你怎么判断没有进中断?

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

使用特权

评论回复
5
紫气东升|  楼主 | 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。请问哪里有错

使用特权

评论回复
6
紫气东升|  楼主 | 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灯又开始不断闪烁(呼吸灯)。
要实现这样的功能你说流程应该是怎么样的?

使用特权

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

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

使用特权

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

靠输入信号响应

使用特权

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

USART没有中断功能

使用特权

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

我用USART1这个引脚做中断触发引脚,还是没有反应

使用特权

评论回复
11
紫气东升|  楼主 | 2016-8-16 15:43 | 显示全部楼层
mintspring 发表于 2016-8-16 11:44
中断函数的配置估计不对,没有达到触发条件。

我想也是,关键是我不知道怎么改,这才是头疼的

使用特权

评论回复
12
紫气东升|  楼主 | 2016-8-16 15:45 | 显示全部楼层
mao20602130 发表于 2016-8-16 11:27
没有使能串口中断

怎样使能串口中断

使用特权

评论回复
13
紫气东升|  楼主 | 2016-8-18 08:34 | 显示全部楼层
mintspring 发表于 2016-8-17 21:41
没用过STM8,只用过STM32,实在是不懂这个STM8内核是51的吗?

我用的是STM8L052C6这个芯片,内核我不知道

使用特权

评论回复
14
紫气东升|  楼主 | 2016-8-18 13:51 | 显示全部楼层
yichunshan 发表于 2016-8-18 09:39
我说你咋就不听呢?
你寄存器值不对

你是说波特率寄存器?我改了啊,还是不得,请再帮我看看哪里有问题,谢谢

使用特权

评论回复
15
紫气东升|  楼主 | 2016-8-18 13:59 | 显示全部楼层
本帖最后由 紫气东升 于 2016-8-18 14:01 编辑

这个程序看来看去,我觉得就是中断函数这块有问题,其他的应该OK。有哪位大神会这款单片机的请多多指教

使用特权

评论回复
16
紫气东升|  楼主 | 2016-8-18 14:05 | 显示全部楼层
上网查其他STM8单片机的例程,都是用库函数写的,为什么就没有用寄存器方式写的呢

使用特权

评论回复
17
紫气东升|  楼主 | 2016-8-19 08:52 | 显示全部楼层
本帖最后由 紫气东升 于 2016-8-19 09:00 编辑
joyme 发表于 2016-8-18 15:39
还没有搞定?贴一段代码给你参考,试试吧
void                sys_uart_init(void)
{

虽然没有实现功能,但还是非常感谢你提供的程序也可能是我太笨,不会怎么改
还有,这样改的话定时器就没有用了

使用特权

评论回复
18
紫气东升|  楼主 | 2016-8-19 17:17 | 显示全部楼层
Soraka 发表于 2016-8-19 10:59
不要在中断中使用延时

已经改了,没有在中断中用延时。效果还是一个样

使用特权

评论回复
19
紫气东升|  楼主 | 2016-8-20 10:45 | 显示全部楼层
airwill 发表于 2016-8-20 07:48
遇到这种情况, 我通常是借助调试器, 检查外设寄存器的值, 跟数据手册进行对比. 来确定配置是否正确.

对于 ...

数据手册都是英文版的,我英语太烂了,而且提供的帮助不是很大

使用特权

评论回复
20
紫气东升|  楼主 | 2016-8-20 13:49 | 显示全部楼层
airwill 发表于 2016-8-20 12:47
除了多读几遍, 好象没有好办法.
要不就换用有中文手册的芯片吧

我有STM8S的中文手册啊,觉得不够详细,能借用的都用上了

使用特权

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

本版积分规则

17

主题

97

帖子

0

粉丝