打印
[STM8]

stm8L151c8t6中断问题

[复制链接]
1068|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
以前用STM8L151都是用库,现在改成用寄存器的方式,但用寄存器的方式开不了总中断,一开程序就死了。
后来查到发现开发定时器4中断,我把其它所有程序都屏蔽了,于是在网上找,意思就是开了中断,但是中断服务程序没有写会有这个现象,但是我是把中断服务程序写了也不行,百思不得其解。
是不是我中断入口地址不对,但是自己写的话也是按iostm8l151c8.h定义的向量号。不知是什么问题,有没有大神帮忙解答一下。我贴上代码
//TIM4中断处理函数
#pragma vector=TIM4_UIF_vector
__interrupt void TIM4_UIF_IRQHandler(void)
{
    unsigned char i = 0;
    i++;
    TIM4_SR1=0x00;
    if(i==122)
    {
      
        i=0;
    }
}
//TIM4初始化
void Init_Timer4(void)
{
    CLK_PCKENR1=0x04; //L系列外设时钟默认关闭,需打开
    TIM4_EGR=0x01;    //计数器更新,可省略
    TIM4_PSCR=0x07;//分频值(2^7)/8M=16us,16us*255*122=500ms
    TIM4_CNTR=255;//计数器值
    TIM4_ARR=255;//自动重装的值
    TIM4_CR1=0x01;//使能计数器
    TIM4_IER=0x01;//更新中断使能
}
void uart3_init(unsigned long baudrate)
{
    unsigned int baud;
    baud = 16000000 / 8 / baudrate;     //设定串口相应波特率与串口时钟的分频数  

    CLK_PCKENR3_bit.PCKEN34 = 1; //使能USART3模块时钟
    //CLK_PCKENR3_PCKEN34 = 1;
    // PE6:Tx  PE7:Rx
    PE_CR1_bit.C16 = 1;
    PE_CR1_bit.C17 = 1;

    USART3_CR1 = 0x00;  // 1个起始位,8个数据位 无校验.并关闭串口
    USART3_CR3 = 0x00;  // 1个停止位      

    //先写BRR2 , 再写BRR1
    USART3_BRR2 = ((unsigned char)((baud & 0xf000) >> 8 )) | ((unsigned char)(baud & 0x000f));//先写波特比率的高4位与低4位
    USART3_BRR1 =  ((unsigned char)((baud & 0x0ff0) >> 4));//后写波特比率的中间8位

    //设置波特率
    //波特率设置为9600
    // 2000000/9600=208    //2000000是此时系统的主时钟频率,默认8分频,16M/8=2M
    //208(DEC)=00D0(HEX)
    //USART3_BRR2 =0x00;//the BRR2 should be programmed before BRR1
    //USART3_BRR1 =0x0D;

   

    USART3_CR2_bit.TIEN = 0;         //发送中断关闭
    USART3_CR2_bit.RIEN = 1;         //使能中断接收
    USART3_CR2_bit.TEN = 1;          //使能发送
    USART3_CR2_bit.REN = 1;          //接收使能
    USART3_CR1_bit.USARTD = 0;        //使能UART1
}
void uart3_sendbyte(unsigned char byte)
{
    unsigned long timeout = 0x5000;
    while(!(USART3_SR&0X80)) //判断发送数据寄存器是否为空
    {
        timeout--;
        if (timeout == 0)
        {
            break;
        }
    }
    USART3_DR = byte;                //向发送寄存器写入数据  
}
void main(void)
{
    asm("sim");                     //关闭系统总中断
    //__disable_interrupt();
    uart3_init(115200);
    Init_Timer4();
    uart3_sendbyte('A');
    asm("rim");                     //打开系统总中断
    //__enable_interrupt();
    while(1)
    {
     ;
    }

使用特权

评论回复
沙发
thxl_kis|  楼主 | 2020-10-3 20:52 | 只看该作者
补充一下,只要开启定时器中断或总中断就进入

983205f78740db844c.png (9.93 KB )

983205f78740db844c.png

使用特权

评论回复
板凳
thxl_kis|  楼主 | 2020-10-3 21:24 | 只看该作者
问题已解决,原来向量号不对
https://blog.csdn.net/kuvinxu/article/details/106318946

使用特权

评论回复
地板
hjl2832| | 2020-10-4 19:36 | 只看该作者
如果是向量地址不对的问题,这个我最开始使用STM8时也碰到过,好像是按数据手册上的地址,在编绎器里的向量地址里要+2吧,记不清了。我好像当时也发过帖子。

使用特权

评论回复
5
hjl2832| | 2020-10-4 19:39 | 只看该作者
看我当时发的帖子,https://bbs.21ic.com/icview-229670-1-1.html,同此贴,给后来人提个醒,如果自己写中断向量,记得按数据手册上的地址+2.

使用特权

评论回复
6
小灵通2018| | 2020-10-6 19:08 | 只看该作者
有点深度的操作

使用特权

评论回复
7
单片小菜| | 2020-10-9 10:28 | 只看该作者
向量地址的问题吧,这个地址需要+2才可以的。

使用特权

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

本版积分规则

3

主题

12

帖子

0

粉丝