完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1、跑马灯实验
操作步骤: ①建立hardware文件夹,在其中建立led子文件夹,建立led.h、led.c ②编写led.h, #ifndef __LED_H #define __LED_H #define LED0 PFout(9)//F9 #define LED0 PFout(10)//F10 void LED_Init(void); #endif 首先要懂得ifndef define endif这个结构 void LED_Init(void) 是led的初始化函数,在头文件里先声明,然后在.c文件中直接定义、应用就行了; PFout(9)这个是位带操作(说实话,不太懂) ③编写led.c文件 #include "led.h" void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure;//定义一个结构体 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIO时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//LED0和LED1对应的IO口 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化IO口 GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置为高电平,灯灭 } ④编写主函数 #include #include int main (void) { delay_init(168); LED_Init(); /*这是通过位带操作完成的*/ while(1) { LED0=0; LED1=0; delay_ms(500); LED0=1; LED1=1; delay_ms(500); } } //下面的是通过库函数来实现的(较常用) whlie(1) { GPIO_ResetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//PIOF9,F10设置为低电平,灯亮 delay_ms(500); GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//PIOF9,F10设置为高电平,灯灭 delay_ms(500); } 2.按键输入实验 操作步骤 ①编写key.h文件 #ifndef __KEY_H #define __KEY_H /*下面是通过库函数来读取IO口*/ #define key0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) #define key1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) #define key2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) #define key_up GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) /*只是通过位带操作来读取IO口 #define key0 PEin(4) //PE4 #define key1 PEin(3) //PE3 #define key2 PEin(2) //P32 #define key_up PAin(0) //PA0 */ void KEY_Init(void);//初始化IO口 u8 KEY_Scan(u8)//按键扫描 #define KEY0_PRES 1 #define KEY1_PRES 2 #define KEY2_PRES 3 #define WKUP_PRES 4 #endif ②编写key.c函数 #include #include #include void KEY_Init(void) { GPIO_InitTypeDef key; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOE,ENBALE);//使能时钟 key.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4; //KEY0 KEY1 KEY2对应引脚 key.GPIO_Mode = GPIO_Mode_IN;//普通输入模式 key.GPIO_Speed = GPIO_Speed_100MHz;//100M key.GPIO_PuPd = GPIO_PuPd_UP;//上拉输入 GPIO_Init(GPIOE,&key);//初始化GPIOE2、E3、E4 key.GPIO_Pin = GPIO_Pin_0;//key——up对应的引脚 key.GPIO_PuPd = GPIO_PuPd_DOWN;//下拉输入 GPIO_Init(GPIOA,&key);//初始化GPIOA0 } //按键处理函数 //返回按键值 //mode 0不支持连续按,1支持连续按 //0,没有任何按键按 //1,key0按下 //2,key1按下 //3,key2按下 //4,key_up按下 //注意此函数有响应优先级,key0>key1>key2>key_up u8 KEY_Scan(u8 mode) { static u8 key_up=1//按键松开标志 if (mode) u8 key_up=1 if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1)) { delay_ms(10);/消抖 key_up=0; if(KEY0==0)return 1; else if(KEY1==0)return 2; else if(KEY2==0)return 3; else if(WK_UP==1)return 4; } else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0) key_up=1; return 0;//没有按键输入 ③编写主函数 #include #include #include int main() { u8 flag; KEY_Init(); LED_Init(); while(1) { flag=KEY_Scan(0); switch(flag) { case key0: LED0=!LED0;//led0翻转 break; case key1: LED1=!LED1;//led1翻转 break; case key2: LED0=!LED0;//led0翻转 LED1=!LED1;//led1翻转 break; } } } 3、串口通信实验 ①编写usart.h #ifndef __USART_H #define __USART_H void my_USART_Init(void);//usart1串口的初始化 void USART1_IRQHandler(void);//usart1的中断服务程序 #endif ②编写usart.c #include #include void my_USART_Init(void) { GPIO_InitTypeDef led0; USART_InitTypeDef Usart1; NVIC_InitTypeDef NVIC0; //使能串口 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //串口1对应引脚复用映射 GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //USART端口配置 led0.GPIO_Mode=GPIO_Mode_AF; led0.GPIO_OType=GPIO_OType_PP; led0.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10; led0.GPIO_PuPd=GPIO_PuPd_UP; led0.GPIO_Speed=GPIO_Speed_100MHz; GPIO_Init(GPIOA,&led0); //USART1初始化设置 Usart1.USART_BaudRate=9600;//波特率 Usart1.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件数据流控制 Usart1.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//收发模式 Usart1.USART_Parity=USART_Parity_No;//无奇偶位校验 Usart1.USART_StopBits=USART_StopBits_1;//1位停止位 Usart1.USART_WordLength=USART_WordLength_8b;//字长为8的数据格式 USART_Init(USART1,&Usart1);//初始化USART串口 //使能USART串口 USART_Cmd(USART1,ENABLE); //开启相关中断 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //USART1 NVIC配置 NVIC0.NVIC_IRQChannel=USART1_IRQn;//串口1中断通道 NVIC0.NVIC_IRQChannelCmd=ENABLE;//开启中断 NVIC0.NVIC_IRQChannelPreemptionPriority=1;//设置抢占优先级 NVIC0.NVIC_IRQChannelSubPriority=1;//设置子优先级 NVIC_Init(&NVIC0); //根据指定的参数初始化NVIC寄存器 } //串口1中断服务程序 void USART1_IRQHandler(void) { u8 res; if(USART_GetITStatus(USART1,USART_IT_RXNE)) { res=USART_ReceiveData(USART1);//接受发送过来的数据 if(res=='a') LED0=!LED0;//LED0反转 if(res=='b') LED1=!LED1;//LED1反转 } } ③编写主函数 #include #include #include int main() { //设置优先级分组 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); LED_Init(); my_USART_Init(); LED0=0; LED1=0; while(1); } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1763 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1617 浏览 1 评论
1059 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
723 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1670 浏览 2 评论
1933浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
726浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
567浏览 3评论
592浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
550浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 13:24 , Processed in 0.773810 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号