#include<stdio.h> #include<stm32f10x.h> void Init_NVIC(void); void InitGPIOB(void); void InitGPIOA(void); int main() { extern u32 Tick_Tenms,Tick_sec;//Tick_Tenms Tick_Sec u32 current,led_value; u32 cnt=0; u32 key1; u32 key2; u32 led_state=1; u32 led_dir=1; Init_NVIC();//SysTick³õʼ»¯£¬¶¨Ê±²úÉúÖÐ¶Ï InitGPIOB();//ÅäÖÃInitGPIoBÒý½ÅΪÊä³öģʽ£¬¿ØÖÆLEDµÄÁÁÃð£¬Êä³öµÍµçƽµÆÁÁ InitGPIOA(); GPIOB->ODR=0;//8¸öµÆ×î³õΪȫÁÁ״̬ current=Tick_Tenms+5; while(1) key1 = GPIOA->IDR&(1 << 8); key2 = GPIOA->IDR&(1 << 11); if(!key1){ while(!key1) //delay_ms(1): key1 = GPIOA->IDR&(1 << 8); led_state = !led_state; } if(!key2){ while( !key2); //delay_ms (1) ; key2 = GPIOA->IDR&(1 << 11) ; led_dir=!led_dir; } if(led_state){ if(current<=Tick_Tenms){ current=Tick_Tenms+50; if(led_dir) led_value=~(1<<cnt); else led_value=~(1<<(7-cnt)); led_value&=0x00ff; cnt++; if(cnt==8){ cnt=0; } } GPIOB->ODR=(GPIOB->ODR&0x0ff00)+led_value;//Êä³öÐźŠ} } void InitGPIOB() { RCC->APB2ENR|=0x0008;//ʱÖÓʹÄÜ£¬GPIOB¶ÔÓ¦bit4λ GPIOB -> CRL =0x33333333 ;//ÉèÖÃÒý½Å GPIOB .0~ GPIOB .7ΪÊä³ö50MHZ£¬ÍÆÍì»ò¿ªÂ©£¬×îµÍλ RCC ->APB2ENR|=0x01; AFIO -> MAPR |=0x02000000; } void InitGPIOA (){ RCC->APB2ENR|=0x0004;//ʱÖÓʹÄÜ, GPIOA¶ÔÓ¦bit3λ GPIOA -> CRH =( GPIOA ->CRH&0xffff00f)|0x00004004;//ÉèÖÃÒý½Å GPIOA .8ºÍ GPIOA .11Ϊ¸¡¿ÕÊäÈëģʽ£¬µ×°åµç·ÓÐÉÏÀµç×è } 给出上述代码的流程图
时间: 2024-02-05 20:04:47 浏览: 77
SeqList.h #include <stdio.h> //包含标准输入输出流的头文件 #include <assert.h
很抱歉,我无法在这个对话框中插入图片或流程图。但是,我可以为您简单描述一下该代码的流程:
1. 调用 Init_NVIC() 函数进行 SysTick 定时器的初始化。
2. 调用 InitGPIOB() 和 InitGPIOA() 函数分别对 GPIOB 和 GPIOA 进行初始化。
3. 在主函数中,使用 Tick_Tenms 和 Tick_sec 变量记录时间,设置当前时间 current,设置初始 LED 状态为 1,设置初始 LED 方向为 1。
4. 进入无限循环,先检测按键 K3 和 K4 是否被按下,如果 K3 被按下,则将 LED 状态取反;如果 K4 被按下,则将 LED 方向取反。
5. 如果 LED 状态为 1,且当前时间 current 小于等于 Tick_Tenms,则更新 current 和 led_value 变量,并将 led_value 传送到 GPIOB 的 ODR 寄存器输出。
6. 循环回到第 4 步。
阅读全文