打印
[STM8]

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

[复制链接]
楼主: 紫气东升
手机看帖
扫描二维码
随时随地手机跟帖
21
紫气东升|  楼主 | 2016-8-16 10:44 | 只看该作者 回帖奖励 |倒序浏览
Mr大风车 发表于 2016-8-16 09:37
你想用TIM3定时检测有没有数据输入?为什么不直接用USART1的中断呢,你这不是USART中断,是TIM3的中断,你 ...

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

使用特权

评论回复
22
yichunshan| | 2016-8-16 10:52 | 只看该作者

USART当然有中断功能

使用特权

评论回复
23
mao20602130| | 2016-8-16 11:27 | 只看该作者
没有使能串口中断

使用特权

评论回复
24
xinzha| | 2016-8-16 11:28 | 只看该作者
中断中while,这是嫌事小啊。

使用特权

评论回复
25
mintspring| | 2016-8-16 11:44 | 只看该作者
中断函数的配置估计不对,没有达到触发条件。

使用特权

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

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

使用特权

评论回复
27
紫气东升|  楼主 | 2016-8-16 15:45 | 只看该作者
mao20602130 发表于 2016-8-16 11:27
没有使能串口中断

怎样使能串口中断

使用特权

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

中断是用于处理实时性要求较高的事情,你在中断内部while 或延时就没有实时性可言...

使用特权

评论回复
29
mintspring| | 2016-8-17 21:41 | 只看该作者
没用过STM8,只用过STM32,实在是不懂这个STM8内核是51的吗?

使用特权

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

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

使用特权

评论回复
31
yichunshan| | 2016-8-18 09:39 | 只看该作者
紫气东升 发表于 2016-8-18 08:34
我用的是STM8L052C6这个芯片,内核我不知道

我说你咋就不听呢?
你寄存器值不对

使用特权

评论回复
32
紫气东升|  楼主 | 2016-8-18 13:51 | 只看该作者
yichunshan 发表于 2016-8-18 09:39
我说你咋就不听呢?
你寄存器值不对

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

使用特权

评论回复
33
紫气东升|  楼主 | 2016-8-18 13:59 | 只看该作者
本帖最后由 紫气东升 于 2016-8-18 14:01 编辑

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

使用特权

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

使用特权

评论回复
35
joyme| | 2016-8-18 15:39 | 只看该作者
还没有搞定?贴一段代码给你参考,试试吧
void                sys_uart_init(void)
{
                USART_SR = 0x40;                                                                                                        //TC enabled
                USART_BRR2 = B9600_BRR2;
                USART_BRR1 = B9600_BRR1;       
                USART_CR1 = 0;                                                                                                       
                USART_CR2 = 0x2C;                                                                                               
}

@far @interrupt void uart_rxd_interrupt (void)                         //UART 接收中断处理函数
{
                /* in order to detect unexpected events during development,
                         it is recommended to set a breakpoint on the following instruction
                */
                uint8_t                bUartData;
                USART_SR &= (~(1 << BIT_RXNE));
                bUartData = USART_DR;
                //接收到一个字节,处理代码
}

。。。。。。。。
        {0x82, uart_rxd_interrupt},  /* irq28 UART RXD*/
。。。。。。。。

使用特权

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

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

使用特权

评论回复
37
Soraka| | 2016-8-19 10:59 | 只看该作者
不要在中断中使用延时

使用特权

评论回复
38
紫气东升|  楼主 | 2016-8-19 17:17 | 只看该作者
Soraka 发表于 2016-8-19 10:59
不要在中断中使用延时

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

使用特权

评论回复
39
airwill| | 2016-8-20 07:48 | 只看该作者
遇到这种情况, 我通常是借助调试器, 检查外设寄存器的值, 跟数据手册进行对比. 来确定配置是否正确.

对于新出来的器件, 很多库函数往往也会有错误, 但是数据手册和编程手册出错的概率比较低.

使用特权

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

对于 ...

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

使用特权

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

本版积分规则