以前用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)
{
;
} |