{
/* Fmaster = 16MHz */
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8); }
void GPIO_Configuration(void) {
/* GPIOD reset */ GPIO_DeInit(GPIOD);
GPIO_Init(GPIOD, GPIO_PIN_2, GPIO_MODE_OUT_PP_LOW_FAST); }
/////////////更新包括向上/向下计数溢出等,那么就要设置事件产生类型和更新中断使能,同时事件更新时计数器不能停止,使能计数器 void TIM4_Configuration(void) {
TIM4_DeInit();////////////定义定时器4;
TIM4_TimeBaseInit(TIM4_PRESCALER_128, 255);/////////定时器分频值设置 TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);/////////运行更新中断 TIM4_UpdateRequestConfig(TIM4_UPDATESOURCE_REGULAR);
TIM4_GenerateEvent( TIM4_EVENTSOURCE_UPDATE);///////////设置更新模式 TIM4_SelectOnePulseMode(TIM4_OPMODE_REPETITIVE); TIM4_SetCounter(255);////设置计数器值 TIM4_SetAutoreload(255); TIM4_Cmd(ENABLE); }
#pragma vector=25
__interrupt void TIM4_UPD_BRK_IRQHandler(void) {
temp++;
if(temp==100) {
GPIO_WriteReverse(GPIOD, GPIO_PIN_2); temp=0; }
TIM4_ClearFlag(TIM4_FLAG_UPDATE); }
////////////一次定时器中断频率=2MHZ/128/255/2=30.63,那么等闪烁的频率为大概是亮灭3秒!
窗口看门狗:
窗口看门狗用于监测由于外部干扰或不可预知的逻辑关系产生的软件错误,这样的软件错误通常会导致应用程序不会按照预期的方式运行。除非程序在递减计数器的T6位变为0之前刷新递减计数器,看门狗电路将在一个预设的时间间隔后产生系统复位;如果在7位的递减计数器数值达到窗口寄存器数值之前刷新递减计数器,同样会产生系统复位。这就意味着智能在一个有限的时间窗口内刷新递减计速器。
WWDG主要功能:
1. 可编程的自由运行递减计数器; 2. 有条件的复位:
——如果开启了看门狗,当递减计数器的数值小于0x04时产生复位
——如果开启了看门狗,当在指定的时间窗口之外重加载递减计数器的数值时产生复位;
3. 硬件或软件启动看门狗(由选择字节指定) 4. 可在HALT指令时产生复位(由选择字节配置)
模拟/数字转换器:ADC
1. ADC1和ADC2是10位的逐次比较型模拟数字转换器。提供多达16个多功能的通道(实际准确的通道数量在数据手册的引脚说明)。A/D转换得各个通道可以执行单次和连续的转换模式。
2. 相对于ADC2,ADC1具有一些扩展功能,包括扫描模式,带缓存的连续模式以及模拟看门狗。
3. ADC1和ADC2的功能如下: 10位的分辨率;
单次和连续的转换模式;
可编程的(转换频率的)预分频:Fmaster可以被分频2到18;
可以选择ADC专用外部中断(ADC_ETR)或者定时器触发信号(IRGO)来作为外部触发信号;
模拟放大(对于具有Vref引脚的型号); 转换结束时可产生中断; 灵活的数据对齐方式;
ADC输入电压范围:VSSA ≤ VIN ≤ VDDA 4. 扩展功能
ADC1具有以下扩展功能: 带缓冲的连续转换模式; 单次和连续转换的扫描模式;
具有上限和下限门槛的模拟看门狗; 模拟看门狗事件发生可产生中断;
5. 引脚描述: Vdda 输入,模拟电源 模拟电源供电端。对于没有外部Vdda引脚的产品该输入引脚是连接到Vdd端的。
VSSA 输入,模拟电源地 模拟电源地端。对于没有外部VSSA引脚的产品该输入引脚是连接到VSSA端的。 Vref- 输入,模拟参考负极 Vref+ 输入,模拟参考正极
AIN[15:0] 模拟输入信号 多达16个模拟输入通道,每次只一个通道ADC转换。
ADC_ETR 数字输入通道 外部触发信号
ADC时钟是由Fmaster时钟经过预分频后供给的。时钟的预分频因子是由ADC_CR1寄存器的SPSEL[2:0]决定的。 通道的选择:
有多达16个外部输入通道。实际上外部通道的数量取决于MCU封装大小。 如果在一次转换过程中改变通道选择,那么当前的转换被复位同时一个新的开始指令脉冲被发送到ADC。
转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式和连续扫描模式。
1. 在单次转换模式中,ADC仅在由ADC_CSR寄存器的CH[3:0]选定的通道上完成一次转
换。该模式是在当CONT位为0时通过置位ADC_CR1寄存器的ADON位来启动的。 一旦转换完成,转换后的数据存储在ADC_DR寄存器中,EOC(转换结束)标志被置EOCIE 被置位将产生一个中断。
程序完成任务:流水灯显示,按键控制不同速率,即按键控制流水灯以不同的速率显示。 #include \
#define uchar unsigned char #define uint unsigned int #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(); TIM2_Configuration(); EXIT_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_0, GPIO_MODE_OUT_PP_LOW_FAST); GPIO_Init(GPIOD, GPIO_PIN_1, GPIO_MODE_OUT_PP_LOW_FAST); GPIO_Init(GPIOD, GPIO_PIN_2, GPIO_MODE_OUT_PP_LOW_FAST); GPIO_Init(GPIOD, GPIO_PIN_3, 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_1024 ,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_WriteHigh(GPIOD, GPIO_PIN_0); GPIO_WriteHigh(GPIOD, GPIO_PIN_1); GPIO_WriteHigh(GPIOD, GPIO_PIN_2); GPIO_WriteHigh(GPIOD, GPIO_PIN_3); switch(temp) {
case 1: GPIO_WriteReverse(GPIOD, GPIO_PIN_1);break; case 2: GPIO_WriteReverse(GPIOD, GPIO_PIN_2);break; case 3: GPIO_WriteReverse(GPIOD, GPIO_PIN_3);break; default:GPIO_WriteReverse(GPIOD, GPIO_PIN_0),temp=0; }
TIM2_ClearITPendingBit(TIM2_IT_UPDATE); }
//////////通用寄存器TIM2,3,5既然这样应该没有太大的区别 #pragma vector=6
__interrupt void EXIT_PORTB_IRQHander(void) {