打印
[STM8]

STM8L052R8串口中断不能产生, IAR环境

[复制链接]
2833|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hailian27|  楼主 | 2015-10-23 09:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目的: 把串口接收中断调通
问题: 用串口助手给单片机发一个字符, 如0x55, 仿真一下, 看到USART1_DR寄存器的值是0x55, 再看一下USART1_SR的值是0xd0, 也就是说, USART1_SR_RXNE位为0. 所以没有进中断,因为就没有产生中断.

Status register (USART_SR)
Address offset: 0x00
Reset value: 0xC0
bit 7
bit 6
bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
TXE
TC
RXNE
IDLE
OR
NF
FE
PE
r
rc_w0
r
r
r
r
r
r

bit 5: RXNE  This bit is set by hardware when the content of the RDR shift register has been transferred to the Bit 5 RXNE: Read data register not empty
USART_DR register. An interrupt is generated if RIEN=1 in the USART_CR2 register. It is cleared by
a read to the USART_DR register.
0: Data is not received
1: Received data is ready to be read.

接受字符前寄存器的值如下图



然后用串口助手给单片机发个0x55, 寄存器中的值如下:

由于USART1_SR的值为0xd0, 所以不会产生中断.
而且此时在主函数死循环中的写的LED灯也不正常工作了, 程序在某个地方卡死了.但是不知道问题出在哪里,希望大家帮帮忙.

谢谢!!!!!!!!!!!!!!!!!!!!!!!!!!
#include "uart.h"

int fputc(int ch, FILE *f)
{  
        //将Printf内容发往串口
        USART1_DR=(unsigned char)ch;
        while(!(USART1_SR & 0x80));        //等待发送完成
        return (ch);
}

/*******************************************************************************
****输入:无
****输出:无
****说明:串口初始化
****作者:
*******************************************************************************/
void uart_init(void)
{
//        unsigned int baud_div = 0;
       
        //USART1初始化
        CLK_PCKENR1_PCKEN15 = 1;        //开启USART1串口时钟
        //初始化IO口
        PC_DDR_DDR3 = 1;
        PC_CR1_C13 = 1;
        PC_CR2_C23 = 1;
        PC_DDR_DDR2 = 0;
        PC_CR1_C12 = 1;
        PC_CR2_C22 = 0;
        //初始化USART1寄存器
        USART1_CR1 = 0x00;
        USART1_CR2 = 0x00;
        USART1_CR3 = 0x00;
       
        USART1_BRR2 = 0x03;
        USART1_BRR1 = 0x68;
       
        USART1_CR2 = 0x2c;        //使能usart1发送和接收,开启接收中断
       
        ITC_SPR8_VECT28SPR = 0;        //设置串口接收中断优先级
}

void uart1_send_char(unsigned char ch)
{
        while(!USART1_SR_TXE);        //等待发送完成
        USART1_DR = ch;
}

int main(void)
{
        sysclk_init();
        delay_init(16);
        main_power_init();
        led_init();
        beep_init();
        adc_init();       
        uart_init();
        MAIN_PWR = 1;        //主电源打开
        led_active();

       asm("rim");//开中断,sim为关中断

        printf("Hello:\n");
        while(1)
        {
                LED6 = !LED6;
                delay_ms(500);
        }

//串口接收中断函数
#pragma vector = USART1_R_RXNE_vector
__interrupt void USART1_R_RXNE_IRQHandler(void)
{
        unsigned char uart1_rx = 0;
        uart1_rx = USART1_DR;
        LED1 = 0;
        LED2 = !LED2;
        printf("OK!\n");
}



USART1_SR.jpg (57.45 KB )

USART1_SR状态寄存器

USART1_SR状态寄存器
沙发
hailian27|  楼主 | 2015-10-23 14:14 | 只看该作者
一个问题, 花了3天时间去怀疑自己, 用了半天时间去怀疑别人, 还好问题自己解决掉了, 竟然没有人回帖子,  靠别人始终不如靠自己啊!

使用特权

评论回复
板凳
lefeng| | 2015-10-23 14:45 | 只看该作者
讲的比较详细,支持一下

使用特权

评论回复
地板
捉虫天师| | 2015-10-24 22:39 | 只看该作者
楼主怎么搞的?啥情况?是寄存器配置错误还是硬件问题(O_O)?

使用特权

评论回复
5
米尔豪斯| | 2015-10-25 16:51 | 只看该作者
程序在某个地方卡死了

具体是什么情况,最后怎么解决的呢

使用特权

评论回复
6
可可球| | 2015-10-25 17:44 | 只看该作者
产生中断时,USART1_SR的值应该是什么

使用特权

评论回复
7
309030106| | 2015-10-25 17:52 | 只看该作者
产生中断时,USART1_SR的值应该是什么

应该是0xc0吧

使用特权

评论回复
8
hailian27|  楼主 | 2015-10-27 11:42 | 只看该作者
捉虫天师 发表于 2015-10-24 22:39
楼主怎么搞的?啥情况?是寄存器配置错误还是硬件问题(O_O)?

IAR的中断向量号要加2

使用特权

评论回复
9
hailian27|  楼主 | 2015-10-27 11:42 | 只看该作者
米尔豪斯 发表于 2015-10-25 16:51
具体是什么情况,最后怎么解决的呢

中断向量号不对, IAR环境要加2

使用特权

评论回复
10
hailian27|  楼主 | 2015-10-27 11:43 | 只看该作者
可可球 发表于 2015-10-25 17:44
产生中断时,USART1_SR的值应该是什么

应该是0xe0

使用特权

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

本版积分规则

3

主题

24

帖子

0

粉丝