#include "iwdg.h"
/*
备注:默认频率是32khz(LSI)
*/
void iwdg_init(u32 xms)
{
IWDG_WriteAccessCmd (IWDG_WriteAccess_Enable);
while(IWDG_GetFlagStatus (IWDG_FLAG_PVU) == SET);
while(IWDG_GetFlagStatus (IWDG_FLAG_RVU) == SET);
IWDG_SetPrescaler (IWDG_Prescaler_32);//频率是1000HZ
IWDG_SetReload (xms);
IWDG_Enable ();
IWDG_ReloadCounter ();
}
#include "IRQ_cfg.h"
extern UART_INFO u1_info;
void usart1_irq_cfg(void)
{
NVIC_InitTypeDef NVIC_InitStruct ;
//1.开启USART1接收+空闲中断使能位
USART_ITConfig (USART1,USART_IT_RXNE, ENABLE);
USART_ITConfig (USART1,USART_IT_IDLE, ENABLE);
//2.配置NVIC
NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;//USART1中断通道号
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能中断通道
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;//响应优先级
NVIC_Init (&NVIC_InitStruct );
}
//编写中断服务函数
//串口接收中断中不要包含printf()等函数
void USART1_IRQHandler(void)
{
u8 data[64] = {0};
if(USART_GetITStatus (USART1,USART_IT_RXNE) == SET)//接收中断发生
{
u1_info.data[u1_info.size] = USART1->DR;
u1_info.size++;
USART_ClearITPendingBit (USART1,USART_IT_RXNE);//手动清除对应中断标志位
}
if(USART_GetITStatus (USART1,USART_IT_IDLE) == SET)//空闲中断发生
{
u1_info.data[u1_info.size] = '\0';//把上述接收的内容当作字符串存储
printf("本次接收的数据长度为:%d 数据为:%s\r\n",u1_info.size,u1_info.data);
USART1->SR;
USART1->DR;
}
}
void tim7_irq_cfg(void)
{
NVIC_InitTypeDef NVIC_InitStruct ;
//1.开启TIM7溢出中断使能位
TIM_ITConfig (TIM7,TIM_IT_Update, ENABLE);
//2.配置NVIC
NVIC_InitStruct.NVIC_IRQChannel = TIM7_IRQn;//TIM7中断通道号
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能中断通道
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;//响应优先级
NVIC_Init (&NVIC_InitStruct );
}
u8 tim_cnt = 0;
//中断发生频率和中断处理频率可以不一致
void TIM7_IRQHandler(void)
{
if(TIM_GetITStatus (TIM7,TIM_IT_Update) == SET)//接收中断发生
{
// tim_cnt++;
// if(tim_cnt % 3 == 0)//实际处理频率300ms
// LED1_FZ;
// if(tim_cnt % 5 == 0)//实际处理频率500ms
// LED2_FZ;
// if(tim_cnt % 9 == 0)//实际处理频率900ms
// LED3_FZ;
// LED4_FZ;//实际处理频率100ms
tim_cnt++;
TIM_ClearITPendingBit (TIM7,TIM_IT_Update);//手动清除对应中断标志位
}
}
//KEY1 - PA0 - EXTI0
void key1_irq_cfg(void)
{
EXTI_InitTypeDef EXTI_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct ;
//1.映射为输入线
SYSCFG_EXTILineConfig (EXTI_PortSourceGPIOA, EXTI_PinSource0);
//2.配置EXTI0
EXTI_InitStruct.EXTI_Line = EXTI_Line0;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling ;//双边沿
EXTI_Init (&EXTI_InitStruct);
//3.配置NVIC
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;//EXTI0中断通道号
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能中断通道
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;//响应优先级
NVIC_Init (&NVIC_InitStruct );
}
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus (EXTI_Line0) == SET)
{
//PLL->HSE
//1.打开HSE
RCC_HSEConfig ( RCC_HSE_ON ) ;
//2.等待HSE打开完成
while(RCC_GetFlagStatus ( RCC_FLAG_HSERDY ) == RESET);
//3.使能PLL(选择HSE为时钟源)
RCC_PLLCmd (ENABLE);
//4.选择PLL为系统时钟
RCC_SYSCLKConfig (RCC_SYSCLKSource_PLLCLK);
printf("退出停止模式!\r\n");
EXTI_ClearITPendingBit (EXTI_Line0);
}
}
//KEY2 - PE2 - EXTI2
void key2_irq_cfg(void)
{
EXTI_InitTypeDef EXTI_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct ;
//1.映射为输入线
SYSCFG_EXTILineConfig (EXTI_PortSourceGPIOE, EXTI_PinSource2);
//2.配置EXTI0
EXTI_InitStruct.EXTI_Line = EXTI_Line2;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling ;//双边沿
EXTI_Init (&EXTI_InitStruct);
//3.配置NVIC
NVIC_InitStruct.NVIC_IRQChannel = EXTI2_IRQn;//EXTI2中断通道号
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能中断通道
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;//响应优先级
NVIC_Init (&NVIC_InitStruct );
}
void EXTI2_IRQHandler(void)
{
if(EXTI_GetITStatus (EXTI_Line2) == SET)
{
// if(KEY2_PRESS)
// {
// TIM_Cmd(TIM7,ENABLE);
// printf("按键2按下!\r\n");
// }
// else
// {
// TIM_Cmd(TIM7,DISABLE);
// printf("按键2松开!\r\n");
// printf("按键2本次按下时长是%dms!\r\n",tim_cnt);
// tim_cnt = 0;
// }
EXTI_ClearITPendingBit (EXTI_Line2);
}
}
//KEY3 - PE3 - EXTI3
void key3_irq_cfg(void)
{
EXTI_InitTypeDef EXTI_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct ;
//1.映射为输入线
SYSCFG_EXTILineConfig (EXTI_PortSourceGPIOE, EXTI_PinSource3);
//2.配置EXTI0
EXTI_InitStruct.EXTI_Line = EXTI_Line3;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;//单边沿
EXTI_Init (&EXTI_InitStruct);
//3.配置NVIC
NVIC_InitStruct.NVIC_IRQChannel = EXTI3_IRQn;//EXTI3中断通道号
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能中断通道
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;//响应优先级
NVIC_Init (&NVIC_InitStruct );
}
void soft_irq_cfg(void)
{
EXTI_InitTypeDef EXTI_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct ;
EXTI_InitStruct.EXTI_Line = EXTI_Line5;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;//单边沿
EXTI_Init (&EXTI_InitStruct);
//3.配置NVIC
NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;//EXTI5中断通道号
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能中断通道
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;//响应优先级
NVIC_Init (&NVIC_InitStruct );
}
extern u32 val;
void EXTI3_IRQHandler(void)
{
if(EXTI_GetITStatus (EXTI_Line3) == SET)
{
PWR->CSR |=(1<<8);//使能WAKE_UP,后续KEY1才能唤醒
PWR_ClearFlag (PWR_FLAG_WU);
printf("进入待机模式!\r\n");
PWR_EnterSTANDBYMode ();
EXTI_ClearITPendingBit (EXTI_Line3);
}
}
void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus (EXTI_Line5) == SET)
{
printf("操作前val=%d\r\n",val);
val++;
tim6_delayms(100);
printf("操作后val=%d\r\n",val);
EXTI_ClearITPendingBit (EXTI_Line5);
}
}
#include "tim.h"
void tim6_init(u32 xms)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
//1.配置时基单元
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1 ;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up ;
TIM_TimeBaseInitStruct.TIM_Period = 10*xms;//重载值
TIM_TimeBaseInitStruct.TIM_Prescaler = 8400 - 1;//8400分频
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit (TIM6, &TIM_TimeBaseInitStruct);
TIM_SetCounter (TIM6, 0);//TIM6->CNT = 0
//2.手动产生更新事件,让配置立即生效
TIM_GenerateEvent (TIM6, TIM_EventSource_Update);
//3.清除标志位
TIM_ClearFlag (TIM6, TIM_FLAG_Update);
}
void tim7_init(u32 xms)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
//1.配置时基单元
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1 ;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up ;
TIM_TimeBaseInitStruct.TIM_Period = 10*xms;//重载值
TIM_TimeBaseInitStruct.TIM_Prescaler = 8400 - 1;//8400分频
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit (TIM7, &TIM_TimeBaseInitStruct);
TIM_SetCounter (TIM7, 0);//TIM6->CNT = 0
//2.手动产生更新事件,让配置立即生效
TIM_GenerateEvent (TIM7, TIM_EventSource_Update);
//3.清除标志位
TIM_ClearFlag (TIM7, TIM_FLAG_Update);
}
/*
函数功能:TIM6毫秒级延时
参数 :u32 xms 期望延时的毫秒数(<=6553)
返回值 :无
备注:默认时钟是84MHZ,实际频率是10000HZ,10个数是1ms
*/
void tim6_delayms(u32 xms)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
//1.配置时基单元
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1 ;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up ;
TIM_TimeBaseInitStruct.TIM_Period = 10*xms;//重载值
TIM_TimeBaseInitStruct.TIM_Prescaler = 8400 - 1;//8400分频
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit (TIM6, &TIM_TimeBaseInitStruct);
TIM_SetCounter (TIM6, 0);//TIM6->CNT = 0
//2.手动产生更新事件,让配置立即生效
TIM_GenerateEvent (TIM6, TIM_EventSource_Update);
//3.清除标志位
TIM_ClearFlag (TIM6, TIM_FLAG_Update);
TIM_Cmd(TIM6,ENABLE);
while(TIM_GetFlagStatus (TIM6, TIM_FLAG_Update) == RESET);
TIM_Cmd(TIM6,DISABLE);
}
/*
函数功能:TIM6微秒级延时
参数 :u32 xus 期望延时的毫秒数
*/
void tim6_delayus(u32 xus)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
//1.配置时基单元
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1 ;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up ;
TIM_TimeBaseInitStruct.TIM_Period = xus;//重载值
TIM_TimeBaseInitStruct.TIM_Prescaler = 84 - 1;//84分频 -> 1MHZ
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit (TIM6, &TIM_TimeBaseInitStruct);
TIM_SetCounter (TIM6, 0);//TIM6->CNT = 0 ;
//2.手动产生更新事件,让配置立即生效
TIM_GenerateEvent (TIM6, TIM_EventSource_Update);
//3.清除标志位
TIM_ClearFlag (TIM6, TIM_FLAG_Update);
TIM_Cmd(TIM6,ENABLE);
while(TIM_GetFlagStatus (TIM6, TIM_FLAG_Update) == RESET);
TIM_Cmd(TIM6,DISABLE);
}
#include "usart1.h"
/*
函数功能:USART1初始化
参数:u32 baud 波特率
备注:
USART1_TX :PA9 复用
USART1_RX :PA10 复用
*/
void usart1_init(u32 baud)
{
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
//1.配置引脚为复用模式
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init (GPIOA, &GPIO_InitStruct);
//2.将引脚复用为指定的功能
GPIO_PinAFConfig (GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
GPIO_PinAFConfig (GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
//3.初始化USART1
USART_InitStruct.USART_BaudRate = baud;//波特率
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None ;//无硬件流控
USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx ; //全双工模式
USART_InitStruct.USART_Parity = USART_Parity_No ; //校验位 无校验
USART_InitStruct.USART_StopBits = USART_StopBits_1; //设置停止位 1位
USART_InitStruct.USART_WordLength = USART_WordLength_8b;//设置字长->数据位 8位
USART_Init (USART1, &USART_InitStruct);
//4.使能USART1
USART_Cmd (USART1, ENABLE);
}
/*
函数功能:USART1发送单字节
参数 :u8 data 待发送内容
返回值:无
*/
void usart1_send_byte(u8 data)
{
//1.等待上次发送完成
while(USART_GetFlagStatus (USART1, USART_FLAG_TXE) == RESET);
//2.进行本次发送
USART_SendData (USART1, data);//USART1->DR = data;
}
/*
函数功能:USART1接收单字节
参数 :无
返回值:u8 接收从U1读取的内容
备注:每次等待有数据才能退出阻塞
*/
u8 usart1_recv_byte(void)
{
//1.等待本次接收完成
while(USART_GetFlagStatus (USART1, USART_FLAG_RXNE) == RESET);
//2.进行本次接收
return USART_ReceiveData (USART1);
}
/*
函数功能:USART1发送字符串
参数 :u8 *data 待发送字符串
返回值:无
*/
void usart1_send_str(u8 *data)
{
u8 *p = data;
while( *p )//while( *p != '\0' )
{
usart1_send_byte(*p);
p++;
}
usart1_send_byte('\0');//补发'\0'
}
/*
函数功能:USART1接收字符串
参数 :u8 *data 保存接收的字符串
返回值:无
备注:
1.XCOM软件发送不包含'\0',
期望后续XCOM发送时勾选上"发送新行"
表示每一帧数据后自带\r\n
2.后续期望该函数可以接收'\n'或者'\0'
作为结束标志的数据,通过宏值控制
比如若工程定义了 XCOM这个宏,则函数
以'\n'作为结束条件,否则以'\0'作为结束条件
*/
void usart1_recv_str(u8 *data)
{
u8 i = 0,temp = 0;
do
{
temp = usart1_recv_byte();
data[i] = temp;
i++;
}
#ifdef XCOM
while( temp != '\n');
#else
while( temp != '\0');
#endif
data[i] = '\0';//补收'\0'
}
#include <stdio.h>
//对printf()函数进行输出重定向->将printf()底层换成U1发送函数
//底层使用的是fputc()函数
int fputc(int ch, FILE *f)
{
//替换为开发者重定向的发送单字节函数
usart1_send_byte(ch);
return (ch);
}
#include "systick.h"
#include <stdio.h>
void systick_init(u32 xms)
{
SysTick->CTRL &=~(1<<2);
SysTick->VAL = 0;
SysTick->LOAD = xms*21000;
SysTick->CTRL |= (1<<1);//使能中断
SysTick->CTRL |= (1<<0);//使能定时器
}
void SysTick_Handler(void)
{
printf("hello\r\n");
}
//以500ms作为延时的一圈
void systick_delayms(u32 xms)
{
// u32 crc = 0 , ret = 0 , i = 0;
// crc = xms / 500;//多少个500ms
// ret = xms % 500;//最后不足500ms的
// SysTick->CTRL &=~(1<<2);
// SysTick->VAL = 0;
// SysTick->LOAD = 500*21000;
// SysTick->CTRL |= (1<<0);
// for(i = 0 ; i < crc ; i++)
// {
// while( !(SysTick->CTRL & (1<<16)) );
// }
// if(ret > 0)
// {
// SysTick->VAL = 0;
// SysTick->LOAD = ret*21000;
// SysTick->CTRL |= (1<<0);
// while( !(SysTick->CTRL & (1<<16)) );
// }
// SysTick->CTRL &= ~(1<<0);
u32 i = 0;
SysTick->CTRL &=~(1<<2);
SysTick->VAL = 0;
SysTick->LOAD = 1*21000;
SysTick->CTRL |= (1<<0);
for(i = 0 ; i < xms ; i++)
{
while( !(SysTick->CTRL & (1<<16)) );
}
SysTick->CTRL &= ~(1<<0);
}
/*
函数功能:systick毫秒级延时
参数 :u32 xms 期望延时的毫秒数(<=798)
返回值 :无
备注:使用外部时钟 21MHZ 最大单次延时时间798ms
?个数是1ms时间
计一个数 1/21000000s == 1/21000ms == 1/21us
21000个数就是1ms
*/
void systick_ms(u32 xms)
{
SysTick->CTRL &=~(1<<2);
SysTick->VAL = 0;
SysTick->LOAD = xms*21000;
SysTick->CTRL |= (1<<0);
while( !(SysTick->CTRL & (1<<16)) )
{}
SysTick->CTRL &= ~(1<<0);
}
void systick_us(u32 xus)
{
SysTick->CTRL &=~(1<<2);
SysTick->VAL = 0;
SysTick->LOAD = xus*21;
SysTick->CTRL |= (1<<0);
while( !(SysTick->CTRL & (1<<16)) )
{}
SysTick->CTRL &= ~(1<<0);
}
#include "led.h"
/*
函数功能:初始化LED
参数:无
返回值:无
备注:
LED1 - PF6 - 低电平点亮
LED2 - PF9 - 低电平点亮
LED3 - PF10 - 低电平点亮
LED4 - PC0 - 低电平点亮
*/
void led_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_9|GPIO_Pin_10;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init (GPIOF, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_Init (GPIOC, &GPIO_InitStruct);
LED1_OFF;LED2_OFF;LED3_OFF;LED4_OFF;
}
/*
函数功能:初始化KEY
参数:无
返回值:无
备注:
KEY1 - PA0 - 按下是高电平
KEY2 - PE2 - 按下是低电平
KEY3 - PE3 - 按下是低电平
KEY4 - PE4 - 按下是低电平
*/
void key_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init (GPIOE, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_Init (GPIOA, &GPIO_InitStruct);
}
/*
函数功能:检测按键是否按下
参数:无
返回值:u8 若KEY1-KEY4有按下,则返回1-4;若无按下,则返回0
备注:按键按下直到松开才视作一次完整的按下动作
*/
u8 key_scan(void)
{
if(KEY1_PRESS)
{
//滤除抖动导致的误识别
systick_delayms(40);
if(KEY1_PRESS)//真正按键按下动作发生
{
while(KEY1_PRESS);//等待按键松开
return 1;
}
}
if(KEY2_PRESS)
{
//滤除抖动导致的误识别
systick_delayms(40);
if(KEY2_PRESS)//真正按键按下动作发生
{
while(KEY2_PRESS);//等待按键松开
return 2;
}
}
if(KEY3_PRESS)
{
//滤除抖动导致的误识别
systick_delayms(40);
if(KEY3_PRESS)//真正按键按下动作发生
{
while(KEY3_PRESS);//等待按键松开
return 3;
}
}
if(KEY4_PRESS)
{
//滤除抖动导致的误识别
systick_delayms(40);
if(KEY4_PRESS)//真正按键按下动作发生
{
while(KEY4_PRESS);//等待按键松开
return 4;
}
}
return 0;
}
#include "main.h"
u8 cnt = 0;
u32 led_time = 100;
UART_INFO u1_info = {0};
extern u8 tim_cnt;
u32 val = 0;
/*
基于按键3按下表示进入待机模式
按键1退出待机模式(WKAE_UP)
*/
int main(void)
{
char buf[64] = {0};
u8 flag = 0;
char *p = NULL,*q = NULL;
int led1,led2,led3,led4;
char beep[10] = {0}; //实际数值
char temp_beep[10] = {0}; //暂存每次最新接收的数据
u8 data[64] = {0};
u8 t_buf[64] = {0};
//1.时钟激活
clock_enable();
//2.中断优先级分组
NVIC_PriorityGroupConfig (NVIC_PriorityGroup_2);//抢占和响应各占2位
//3.外设&模块初始化
led_init();
key_init();
usart1_init(115200);
//tim6_init(6000);
// tim7_init(1);
//systick_init(200);
// iwdg_init(3000);
// printf("cpu reset!\r\n");
//4.中断初始化
usart1_irq_cfg();
// tim7_irq_cfg();
key1_irq_cfg();
key2_irq_cfg();
key3_irq_cfg();
// soft_irq_cfg();
while(1)
{
LED1_ON;LED4_OFF;tim6_delayms(100);
LED2_ON;LED1_OFF;tim6_delayms(100);
LED3_ON;LED2_OFF;tim6_delayms(100);
LED4_ON;LED3_OFF;tim6_delayms(100);
}
return 0;
}
void clock_enable(void)
{
RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA, ENABLE);
RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOC, ENABLE);
RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOF, ENABLE);
RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOE, ENABLE);
RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1, ENABLE);
RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM6, ENABLE);
RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM7, ENABLE);
RCC_APB2PeriphClockCmd (RCC_APB2Periph_SYSCFG, ENABLE);
RCC_APB2PeriphClockCmd (RCC_APB2Periph_EXTIT, ENABLE);
}
以上是在kile5里开发的STM32代码现在提出如下要求:
长按3s以上关机,再长按3s以上开机
最新发布