40_不要重载&&、||

不要重载&&、|| 因为 用户无法实现 && ||的短路特性。

&& 短路特性: A && B 如果A为假 B将不会执行

|| 短路特性: A || B 如果A为真 B将不会执行

#include <iostream>

using namespace std;

class Complex{
public:
    Complex(int flag){
        this->flag = flag;
    }
    Complex& operator+=(Complex& complex){
        this->flag = this->flag + complex.flag;
        return *this;
    }
    bool operator&&(Complex& complex){
        return this->flag && complex.flag;
    }
public:
    int flag;
};
int main(){

    Complex complex1(0);  //flag 0
    Complex complex2(1);  //flag 1

    //原来情况,应该从左往右运算,左边为假,则退出运算,结果为假
    //这边却是,先运算(complex1+complex2),导致,complex1的flag变为complex1+complex2的值, complex1.a = 1
    // 1 && 1
    //complex1.operator&&(complex1.operator+=(complex2))
    if (complex1 && (complex1 += complex2)){
        //complex1.operator+=(complex2)
        cout << "真!" << endl;
    }
    else{
        cout << "假!" << endl;
    }

    return EXIT_SUCCESS;
}

运行结果:

&&的短路特性 期望的结果是假,但是程序的结果为真

#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以上开机
最新发布
07-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值