就是想写个sif协议,用定时器,1ms进一次中断,电平翻转,但是波形状态不更新,只能发一个位,发不了一个字节,stm8s005
主函数
#include "system.h"
extern void GPIO_Init (void);
extern void TIM1_Init (void);
void send_bit(uchar);
void send_byte(uchar);
uchar temp=2,count;
void Clock_Init(void)
{
CLK_ICKR |= 0x01;//使能HSI时钟
CLK_ECKR &= 0x00;//关闭外部时钟
CLK_CKDIVR = 0x00;//设置时钟为16MHZ
}
int main()
{
Clock_Init();
GPIO_Init();
TIM1_Init();
_asm("rim");
while (1);
}
@far @interrupt void TIM1_update_overflow_underflow_trigger_break (void)
{
TIM1_SR1 &= 0x00;
if(temp<2)
{
send_bit(temp);
temp++;
}
else
{
temp=0;
send_bit(temp);
temp++;
}
}
void send_bit(uchar temp)
{
switch(temp)
{
case 0 :
if(count < 96)count ++;
else
{
count = 1;
}
if(count < 65)
{
PA_ODR &= 0xdf;//1ms
}
else
{
PA_ODR |= 0x20;//1ms
}
break;
case 1 :
if(count < 96)count ++;
else
{
count = 1;
}
if(count < 33)
{
PA_ODR &= 0xdf;//1ms
}
else
{
PA_ODR |= 0x20;//1ms
}
break;
case 2 :
if(count < 96)count ++;
else
{
count = 1;
}
if(count < 94)
{
PA_ODR &= 0xdf;//1ms
}
else
{
PA_ODR |= 0x20;//1ms
}
break;
}
}
定时器1函数
#include "system.h"
void GPIO_Init(void)
{
PA_DDR |= 0x20;//设置PA5为输出模式
PA_CR1 |= 0x20;//设置PA5为推挽输出模式
PA_CR2 |= 0x20;//设置输出频率为10MHZ
}
void TIM1_Init(void)
{
_asm("sim");//关闭总中断
TIM1_CR1 &= 0x00;//CR1初始化
TIM1_IER &= 0x00;//中断使能寄存器初始化
TIM1_EGR |= 0x01;//产生更新时事件
TIM1_PSCRH = 83/256;//PSCR高八位处理
TIM1_PSCRL = 83%256;//PSCR低八位处理
TIM1_CNTRH = 0x00;//计数器高八位置0
TIM1_CNTRL = 0x00;//计数器低八位置0
TIM1_ARRH = 0x00;//自动装载寄存器为20
TIM1_ARRL = 0x01;
TIM1_CR1 |= 0x81;//自动装载使能,计数器使能
TIM1_IER |= 0x01;//定时器更新中断使能
TIM1_SR1 |= 0x00;
}
更改为TIM_CH1模式,再次烧录
PA5脚上电压应该会有变化的,排查一下定时器是否每次都有进中断。