TC7 = TIMER_PERIOD; // 设置定时器计数值出错
时间: 2023-11-26 15:05:42 浏览: 41
很可能是因为`TIMER_PERIOD`的数据类型不匹配而导致设置定时器计数值出错。在S9S12G128芯片中,定时器计数器的计数值是一个16位无符号整数,范围是0x0000~0xFFFF。因此,如果`TIMER_PERIOD`的数据类型不是16位无符号整数,就会导致设置定时器计数值出错。
要解决这个问题,可以将`TIMER_PERIOD`的数据类型改为16位无符号整数,即`unsigned int`或`uint16_t`。同时,为了避免数据类型不匹配的问题,可以将定时器计数值直接赋值给`TC7H`和`TC7L`寄存器,而不是使用`TC7`寄存器。具体代码如下:
```
#define TIMER_PERIOD 8000 // 定时器计数值
void timer_init(void);
interrupt VectorNumber_Vtimch7 void timer_isr(void);
void main(void) {
timer_init(); // 初始化定时器
EnableInterrupts; // 开启全局中断
for(;;) {
// 主循环中可以执行其他操作
}
}
void timer_init(void) {
TSCR1 = 0x80; // 启动定时器,使用内部总线时钟
TSCR2 = 0x00; // 设置定时器时钟分频系数为1,不使用输出比较功能
TIOS |= 0x80; // 设置定时器7为输出比较模式
TC7H = TIMER_PERIOD >> 8; // 设置定时器计数值的高8位
TC7L = TIMER_PERIOD & 0xFF; // 设置定时器计数值的低8位
TIE |= 0x80; // 开启定时器7的中断
}
interrupt VectorNumber_Vtimch7 void timer_isr(void) {
TFLG1 |= 0x80; // 清除定时器7中断标志位
// 在这里执行需要定时执行的操作
}
```
在上述代码中,首先将`TIMER_PERIOD`的数据类型改为了`unsigned int`,并将其值设为8000,即定时器计数值的1/1000。然后在`timer_init()`函数中,将定时器计数值的高8位和低8位分别赋值给`TC7H`和`TC7L`寄存器。最后开启定时器7的中断。
这样做可以避免数据类型不匹配的问题,同时也可以提高代码的可读性和可维护性。
相关推荐
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)