#define ulong unsigned long unsigned int temp; void delay(ulong i) {
ulong j;
for(j=0;j
void CLK_Configuration(void); void GPIO_Configuration(void); void TIM2_Configuration(void); void EXIT_Configuration(void); void main(void) {
CLK_Configuration(); GPIO_Configuration(); EXIT_Configuration(); TIM2_Configuration(); enableInterrupts(); while (1) { } }
void CLK_Configuration(void) {
/* Fmaster = 16MHz */
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); }
void GPIO_Configuration(void) {
/* GPIOD reset */ GPIO_DeInit(GPIOB); GPIO_DeInit(GPIOD);
/* Configure PD1 (LED1) as output push-pull low (led switched on)10MHZ */
GPIO_Init(GPIOD, GPIO_PIN_2, GPIO_MODE_OUT_PP_LOW_FAST); GPIO_Init(GPIOB, GPIO_PIN_1, GPIO_MODE_IN_FL_IT); }
void TIM2_Configuration(void)
{
TIM2_DeInit();///设置timer2定时器 TIM2_TimeBaseInit( TIM2_PRESCALER_2048 ,8000); /*对TIM2时钟进行预分频得到计数时钟 */
TIM2_ITConfig(TIM2_IT_UPDATE ,ENABLE); /*允许更新中断使能*/
//TIM2_GenerateEvent(TIM2_EVENTSOURCE_UPDATE); /*设置事件源为更新事件*/
// TIM2_UpdateRequestConfig(TIM2_UPDATESOURCE_REGULAR );/*更新请求使能,只有当计数器溢出时产生更新中断*/
// TIM2_SelectOnePulseMode( TIM2_OPMODE_REPETITIVE ); /*发生更新事件时计数器不停止*/
TIM2_SetCounter(65536-8000); /*16位向上计数器初值*/
TIM2_Cmd(ENABLE); /*使能计数器*/ }
void EXIT_Configuration(void) {
EXTI_DeInit();
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOB, EXTI_SENSITIVITY_FALL_ONLY); }
/*TIM2定时/向上溢出中断编号为13,中断编号+2*/ #pragma vector=15
__interrupt void TIM2_UPD_OVF_BRK_IRQHandler (void) {
GPIO_WriteReverse(GPIOD, GPIO_PIN_2); TIM2_ClearITPendingBit(TIM2_IT_UPDATE); }
//////////通用寄存器TIM2,3,5既然这样应该没有太大的区别 #pragma vector=6
__interrupt void EXIT_PORTB_IRQHander(void) {
if((GPIO_ReadInputData(GPIOB)&GPIO_PIN_1)==0x00) {
temp++;
switch(temp) {
case 1:TIM2_TimeBaseInit( TIM2_PRESCALER_256 ,8000);break;
case 2:TIM2_TimeBaseInit( TIM2_PRESCALER_512 ,8000);break; case 3:TIM2_TimeBaseInit( TIM2_PRESCALER_1024 ,8000);break; case 4:TIM2_TimeBaseInit( TIM2_PRESCALER_2048 ,8000);break; case 5:TIM2_TimeBaseInit( TIM2_PRESCALER_4096 ,8000);break; case 6:TIM2_TimeBaseInit( TIM2_PRESCALER_8192 ,8000);break; default:TIM2_TimeBaseInit( TIM2_PRESCALER_2048 ,8000),temp=1; } } }
此例子中,即使不适用更新事件也是可以使用的,就是单纯的作为定时器使用。但是什么时候用更新事件呢?更新事件包括溢出中断和初始化中断等,这个到底怎么回事?
TIME1与TIM2,3,5与TIM4,6不同:
STM8S提供三种类型的TIM定时器:高级控制型(TIM1),通用型(TIM2,TIM3,TIM5)和基本型定时器(TIM4和TIM6)。 TIM1,2,3,5都是16位,TIM4,6是8位。
TIM1(高级控制定时器)由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动。包括四个不同的捕获/比较通道。 高级控制定时器用途: 1. 基本的定时;
2. 测量输入信号的脉冲宽度;
3. 产生输出波形(输出比较,PWM和单脉冲模式);
4. 对应不同事件(捕获,比较,溢出,刹车,触发)的中断;
5. 与TIM5/TIM6或者外部信号(外部时钟,复位信号,触发和使能信号)同步; 高级控制定时器广泛的适用于各种控制应用中,包括哪些需要中间对齐模式PWM的应用,该模式支持互补输出和死区时间控制。
高级控制定时器的时钟源可以是内部时钟也可以使外部时钟的信号,可以通过配置寄存器选择。 主要特性:
1.16位向上/向下,向上,向下自动装载计数器;
2.允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器; 3.16位可编程(可以实现修改)预分频器,计数器时钟频率的分频系数位1~65536
之间任意数值;
4.同步电路,用于使用外部信号控制定时器以及定时器互联(某些型号的芯片没有此功能);
5.多达4个独立通道可以配置成: 输入捕获; 输出比较;
PWM生成(边缘或者中间对齐模式); 六步PWM输出; 单脉冲模式输出;
三个支持带互补输出,并且死区时间可编程的通道;
刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态。 产生中断的事件包括: 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者外部/内部触发) 触发事件(计数器启动,停止,初始化或者由外部/内部触发计数) 输入捕获; 输出比较; 刹车信号输入;
时基单元:16位向上/向下计数器;16位自动重载寄存器;重复计数器;预分频器 16位计数器,预分频器,自动重载寄存器和重复计数器寄存器都可以通过软件进行读写操作。 自动重载寄存器由预装载寄存器和影子寄存器组成。 什么是影子寄存器?
自动预装载已使能(TIM1_CR1寄存器的ARPE位置位)。在此模式下,写入自动重载寄存器的数据将被保存在预装载寄存器中,并在下一个更新事件(UEV)时传送到影子寄存器。 自动预装载已禁止(TIM1_CR1寄存器的ARPE位清除)。在此模式下,写入自动重载寄存器的数据将立即写入影子寄存器。
更新事件的产生:
1. 计数器向上或向下溢出;
2. 软件置位了TIM1_EGR寄存器的UG(更新事件发生)位; 3. 时钟/触发控制器产生了触发事件;
置位TIM1_CR1寄存器的UDIS位将禁止更新事件(UEV)。
计数器由预分频器的输出CK_CNT驱动,而CK_CNT仅在IM1_CR1寄存器的计数器使能位(CEN)被置位时才有效。 (在使能了CEN位的一个时钟周期后,计数器才开始计数)(好好看一下时钟各种周期之间关系)
写计数器的操作没有缓存,并且可以在任何时候写TIM1_CNTRH和TIM1_CNTRL寄存器,因此我们建议不要在计数器运行时写入新的数值,以免写入了错误的数值。
注意:不要使用LDW指令来读取16位计数器的值,因为此指令先读低位(LS)字
节,这样读出的数值是错误的
预分频器的实现:TIM1的预分频器基于一个由16位寄存器(TIM1_PSCR控制的16位计数器。由于这个控制器带有缓冲器,因此它能够在运行时被改变。预分频器可以将计数器的时钟频率按照1~65536之间任意值分频。 fCK_CNT = fCK_PSC / (PSCR[15:0] + 1)
预分频器的值由与装载寄存器写入,保存了当前使用值的影子寄存器在低位
(LS)写入时被载入。需两次单独的写操作来写16位寄存器,高位(MS)先写。
例题:应用8位定时器TIM4定时控制灯的闪动, #include \
#define uchar unsigned char #define uint unsigned int #define ulong unsigned long unsigned int temp;
void CLK_Configuration(void); void GPIO_Configuration(void); void TIM4_Configuration(void); void display(); void main(void) {
CLK_Configuration(); GPIO_Configuration(); TIM4_Configuration(); enableInterrupts(); while (1) { } }
void CLK_Configuration(void)
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库stm8s的c语言编程例程应用(4)在线全文阅读。
相关推荐: