[mw_shl_code=c,true]#include "stm32f10x_lib.h"
#include "stdio.h"
#include "stdlib.h"
#include <string.h>
/* 自定义同义关键字 --------------------------------------------------------*/
/* 自定义参数宏 --------------------------------------------------------*/
/* 自定义函数宏 --------------------------------------------------------*/
/* 自定义全局变量 ----------------------------------------------------*/
vu16 CCR1_Val = 40000; /* 初始化输出比较通道1计数周期变量*/
vu16 CCR2_Val = 20000; /* 初始化输出比较通道2计数周期变量*/
vu16 CCR3_Val = 10000; /* 初始化输出比较通道3计数周期变量*/
vu16 CCR4_Val = 5000; /* 初始化输出比较通道4计数周期变量*/
vu16 countersecond;
/* 自定义函数声明 --------------------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void TIM_Configuration(void);
void USART_Configuration(void);
void USART_Printf(USART_TypeDef* USARTx,char *pch);
void Delay_us(vu32 n);
void Delay_s(vu32 n);
void Delay_ms(vu32 n);
int fputc(int ch, FILE *f);
/*******************************************************************************
* 函数名 : main
* 函数描述 : main 函数
* 输入参数 : 无
* 输出结果 : 无
* 返回值 : 无
*******************************************************************************/
int main(void)
{
/* 设置系统时钟 */
RCC_Configuration();
/* 设置 NVIC */
GPIO_Configuration();
USART_Configuration();
NVIC_Configuration();
/* 设置 GPIO 端口 */
/* 设置 TIM */
TIM_Configuration();
while (1)
{
if(countersecond==0x08)
{ GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_4)));
// printf("2014年12月15日 星期一 阴天\r\n");
// USART_Printf(USART1,"2014年12月15日 星期一 阴天\r\n");
countersecond=0;
}
}
}
/******************************************************************************
* 函数名 : Delay_us 、Delay_s
* 函数描述 : Systick延时程序
* 输入参数 : 无
* 输出结果 : 无
* 返回值 : 无
******************************************************************************/
void Delay_us(vu32 n)
{
SysTick->LOAD=72*n; //装载计数值,,因为时钟为72M,72次计时1us
SysTick->CTRL=0x00000005; //时钟来源为HCLK(72M),打开定时器
while(!(SysTick->CTRL&0x00010000)); //等待计数到0
SysTick->CTRL=0x00000004; //关闭定时器
}
void Delay_s(vu32 n)
{
vu16 i;
for (i=0;i<5*n;i++)
Delay_us(200000);
}
void Delay_ms(vu32 n)
{
vu16 i;
for (i=0;i<5*n;i++)
Delay_us(200);
}
/******************************************************************************
* 函数名 : RCC_Configuration
* 函数描述 : 设置系统各部分时钟
* 输入参数 : 无
* 输出结果 : 无
* 返回值 : 无
******************************************************************************/
void RCC_Configuration(void)
{
/* 定义枚举类型变量 HSEStartUpStatus */
ErrorStatus HSEStartUpStatus;
/* 复位系统时钟设置 */
RCC_DeInit();
/* 开启 HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* 等待 HSE 起振并稳定 */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
/* 判断 HSE 起是否振成功,是则进入if()内部 */
if(HSEStartUpStatus == SUCCESS)
{
/* 选择 HCLK(AHB)时钟源为SYSCLK 1分频 */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* 选择 PCLK2 时钟源为 HCLK(AHB) 1分频 */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* 选择 PCLK1 时钟源为 HCLK(AHB) 2分频 */
RCC_PCLK1Config(RCC_HCLK_Div2);
/* 设置 FLASH 延时周期数为2 */
FLASH_SetLatency(FLASH_Latency_2);
/* 使能 FLASH 预取缓存 */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则输出频率为72MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
/* 使能 PLL */
RCC_PLLCmd(ENABLE);
/* 等待 PLL 输出稳定 */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
/* 选择 SYSCLK 时钟源为 PLL */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* 等待 PLL 成为 SYSCLK 时钟源 */
while(RCC_GetSYSCLKSource() != 0x08);
}
/* 打开 TIM2 时钟 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* 打开 APB 总线上的 GPIOA,USART1 时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);
}
/*******************************************************************************
* 函数名 : GPIO_Configuration
* 函数描述 : 设置各GPIO端口功能
* 输入参数 : 无
* 输出结果 : 无
* 返回值 : 无
*******************************************************************************/
void GPIO_Configuration(void)
{
/* 定义 GPIO 初始化结构体 GPIO_InitStructure */
GPIO_InitTypeDef GPIO_InitStructure;
/* 配置 GPIOA.4, GPIOA.5, GPIOA.6, GPIOA.7 为推挽输出 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3|GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 设置USART1的Tx脚(PA.9)为第二功能推挽输出模式 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA , &GPIO_InitStructure);
/* 设置USART1的Rx脚(PA.10)为浮空输入脚 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA , &GPIO_InitStructure);
}
/*******************************************************************************
* 函数名 : TIM_Configuration
* 函数描述 : 设置TIM各通道
* 输入参数 : 无
* 输出结果 : 无
* 返回值 : 无
*******************************************************************************/
void TIM_Configuration(void)
{
/* 定义 TIM_TimeBase 初始化结构体 TIM_TimeBaseStructure */
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
/* 定义 TIM_OCInit 初始化结构体 TIM_OCInitStructure */
TIM_OCInitTypeDef TIM_OCInitStructure;
/*
* 计数重载值为65535
* 预分频值为(7199 + 1 = 7200)
* 时钟分割0
* 向上计数模式
*/
TIM_TimeBaseStructure.TIM_Period = 65535;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2 , &TIM_TimeBaseStructure);
/* 设置预分频值,且立即装入 */
TIM_PrescalerConfig(TIM2 , 7199 , TIM_PSCReloadMode_Immediate);
/*
* 设置 OC1,OC2,OC3,OC4 通道
* 工作模式为计数器模式
* 使能比较匹配输出极性
* 时钟分割0
* 向上计数模式
*/
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
TIM_OC4Init(TIM2, &TIM_OCInitStructure);
/* 禁止预装载寄存器 */
TIM_OC1PreloadConfig(TIM2 , TIM_OCPreload_Disable);
TIM_OC2PreloadConfig(TIM2 , TIM_OCPreload_Disable);
TIM_OC3PreloadConfig(TIM2 , TIM_OCPreload_Disable);
TIM_OC4PreloadConfig(TIM2 , TIM_OCPreload_Disable);
/* 使能 TIM 中断 */
TIM_ITConfig(TIM2 , TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4 , ENABLE);
/* 启动 TIM 计数 */
TIM_Cmd(TIM2 , ENABLE);
}
/*******************************************************************************
* 函数名 : NVIC_Configuration
* 函数描述 : 设置NVIC参数
* 输入参数 : 无
* 输出结果 : 无
* 返回值 : 无
*******************************************************************************/
void NVIC_Configuration(void)
{
/* 定义 NVIC 初始化结构体 */
NVIC_InitTypeDef NVIC_InitStructure;
/* #ifdef...#else...#endif结构的作用是根据预编译条件决定中断向量表起始地址*/
#ifdef VECT_TAB_RAM
/* 中断向量表起始地址从 0x20000000 开始 */
NVIC_SetVectorTable(NVIC_VectTab_RAM , 0x0);
#else /* VECT_TAB_FLASH */
/* 中断向量表起始地址从 0x80000000 开始 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH , 0x0);
#endif
/* 选择优先级分组0 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
/* 开启 TIM2 中断, 0级先占优先级,0级后占优先级 */
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*******************************************************************************
* 函数名 : USART_Configuration
* 函数描述 : 设置USART1
* 输入参数 : None
* 输出结果 : None
* 返回值 : None
*******************************************************************************/
void USART_Configuration(void)
{
/* 定义USART初始化结构体 USART_InitStructure */
USART_InitTypeDef USART_InitStructure;
/* 配置串口5、串口2、串口3未使用硬件流
* 波特率为9600bps
* 8位数据长度
* 1个停止位,无校验
* 禁用硬件流控制
* 禁止USART时钟
* 时钟极性低
* 在第2个边沿捕获数据
* 最后一位数据的时钟脉冲不从 SCLK 输出
*/
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口2接收中断
USART_Cmd(USART1, ENABLE);
}
void USART_Printf(USART_TypeDef* USARTx,char *pch)
{
while(*pch != '\0')
{
USART_SendData(USARTx,*pch);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
USART_ClearFlag(USARTx, USART_FLAG_TXE);
pch++;
}
}
/*int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (unsigned char) ch);// USART1 可以换成 USART2 等
while (!(USART1->SR & USART_FLAG_TC));
return (ch);
} */
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]这是Timer定时器中断函数[/mw_shl_code]
[mw_shl_code=c,true]void TIM2_IRQHandler(void)
{
vu16 capture = 0; /* 当前捕获计数值局部变量 */
/*
* TIM2 时钟 = 72 MHz, 分频数 = 7299 + 1, TIM2 counter clock = 10KHz
* CC1 更新率 = TIM2 counter clock / CCRx_Val
*/
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0)));
/* 读出当前计数值 */
capture = TIM_GetCapture1(TIM2);
/* 根据当前计数值更新输出捕获寄存器 */
TIM_SetCompare1(TIM2, capture + CCR1_Val);
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
}
else if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_1, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1)));
capture = TIM_GetCapture2(TIM2);
TIM_SetCompare2(TIM2, capture + CCR2_Val);
TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
}
else if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_2, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2)));
capture = TIM_GetCapture3(TIM2);
TIM_SetCompare3(TIM2, capture + CCR3_Val);
TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
countersecond++;
}
else
{
GPIO_WriteBit(GPIOA, GPIO_Pin_3, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_3)));
capture = TIM_GetCapture4(TIM2);
TIM_SetCompare4(TIM2, capture + CCR4_Val);
TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);
}
}
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
就是一个死循环,这个打印函数,我在其他地方用都是好的,就是这个地方有问题。。。这是一个timer定时器。 在里面屏蔽掉打印,直接让灯亮灯灭,是对的。就是加入打印函数的时候,就在打印函数那个地方死循环。该配置的地方我都配置了的。 求指导。。 |