其实个人来说,这个如果真有用的话,这个有必要,虽说没什么用,对吧,但心里是一个安慰,这其实第一,二这个汇演在那真的那个白光一般来说还是比较对于眼睛来说,你平时学习什么?在晚上开这个灯比真的看那个台灯啊,其他
黄光好。电灯发出的光是全色光,但各种色光的成份比例是由发光物质(钨)以及温度决定的。比例不平衡就导致了光的颜色的偏色,所以在白炽灯下物体的颜色不够真实。人的眼睛是根据所看见的光的波长来识别颜色的。可见光谱中
1、使用多种颜色的芯片(一般是红、绿、蓝),电路用IC单独控制,可实现单色变幻,流水等效果。2、使用控制器控制,RGB混光,可实现 红橙黄绿青蓝紫 以及白光等30多种颜色,有流水,跑马,闪烁,渐变等多种效果。
要知道,三菱镜散射时可以把太阳光分解成红橙黄绿青蓝紫七色,而实际上生产的LED灯是单色光,根据RGB三基色原理,要想发白光必须有与之互补的色光。
只要将默认接通电源后输出的电源接到白光的LED上即可,那么打开就是白光。LED灯发白光的原理如下:1、蓝光LED与黄色荧光粉组合。2、红/绿/蓝三色LED组合。3.、紫外UV LED与多色(RGB)荧光粉组合。平时所说的白光是指白天
stm32三色灯怎么实现红橙黄绿青蓝紫闪烁
break;case 1: LED1=!LED1;delay_ms(200);break;case 2:LED2=!LED2;delay_ms(200);break;default:break;} void 在这里按键获取函数(void){ key=获取到的值; //没有按键按下的话是进入不到这里 } } }
题目不清楚,假设8个灯,整体循环一次的时间是80s,后一个灯亮了3s后前一个灯才允许熄灭。那么可以用定时器,定时器中采用一个变量aaa进行计数累加,比如设定一个1s的定时器,每次进入定时器变量aaa加1,aaa加到80就清零
使用GPIO功能前,首先要初始化系统,最简单的方法为:添加stm32f10x_rcc.c,打开stm32f10x_conf.h 在第41行将/* #include "stm32f10x_rcc.h""*/两边注释符去掉,在main函数中添加代码SystemInit();添加stm32f10x_g
在使用STM32单片机编写点亮流水灯的程序时,可以使用if或for语句来实现两个LED交替闪烁的效果,代码中可以通过判断条件(两个LED是否已经交替闪烁)来控制LED状态的变化,从而实现了两个LED之间交替闪烁的效果。
首先要看下《STM32F10xxx参考手册CD00171190.pdf》里关于IO端口的介绍,第8章 通用和复用功能I/O(GPIO和AFIO)百为STM3210E-EVAL开发板上的CPU是STM32F103ZET6,有GPIOA~GPIOG七组IO,每组IO有16个引脚GPIO_Pin_0~
主要应用到的外设有定时器,GPIO就能够实现流水灯的效果。用定时器做1s的定时中断,在中断程序中进行GPIO 输出高低电平的切换就可以了。
新手求助各位师傅,关于STM32通过按键控制流水灯
Keil uVision4实例 51单片机控制LED灯闪烁,关键看C语言的编程细节。建立项目:LED灯闪烁。新建C文件:LED灯闪烁 引用51头文件。将所有的灯都点亮。让所有的灯全部灭了。添加循环语句。添加一个变量。使用循环语句创造延迟。
1、打开keil软件,在工具栏点击Project选项选择new uVision Project创建新的工程并保存,步骤如下图所示:2、创建新的文件,按快捷键“ctrl+s”命名为led.c并保存,步骤如下:3、将创建的51.c文件添加到51项目中,鼠标
LED=0; //初始化LED为关闭状态 while(1){ LED=1; //点亮LED } } 完 最主要还要看看你的硬件
4.上传程序:将编写好的程序上传到单片机中。将单片机通过USB线连接到计算机,选择正确的开发板和端口,然后点击上传按钮将程序烧录到单片机中。5.测试控制:完成上传后,单片机将开始执行程序。LED灯应该会按照程序中定义的亮灭
思路: 控制吧个LED灯,使用上拉方式控制,引脚高电平灯灭,引脚低电平灯亮。 这吧个LED使用同一P口上的所有引脚,假设为P一口中的P一.0-P一.漆共吧个脚。
1、确定板子上LED灯的引脚位置是属于哪个口PORTA~PORTE 2、例程内的端口是否与硬件上的端口一致。3、LED的驱动电平是高电平还是低电平。4、一个GPIO正常工作至少需要以下几点:a、系统时钟已经配置并正常运行。b、对应的GPIO
怎么使stm32上的led灯亮,点击keil uvision上的什么按钮才可以控制板子呢
开发板上4个LED是接到STM32的4个IO口上的,要点亮LED,只要在这4个IO上输出对应的高电平 那如何让STM32在PF6~PF9这4个IO上输出高点平呢 首先要看下《STM32F10xxx参考手册CD00171190.pdf》里关于IO端口的介绍,第8
①配置所需的GPIO管脚,也就是PA2和PA3。②从程序来看,高电平点亮,低电平熄灭。
我不知道为什么中文复制之后这里变乱码了,所以截图作为参照,代码附在后面:include "sys.h"#include "usart.h"#include "delay.h"#include "led.h" #include "key.h" //°´¼ü´¦À
先定义对应LED 的控制端口#define LED PAout(0)然后LED=~LED;
等到执行到 while(!ReadValue);//等待按键被放开 这条指令时 数据仍然是上次采集到的那个值代表按键按下,(!ReadValue)这个值永远成立,所以无法代表按键断开。所以程序一直卡死在这条指令上。如果要通过就必须在判据里重新
请教一个stm32程序:我写了一个按键控制LED灯翻转,调试成功的程序如下:
使用GPIO功能前,首先要初始化系统,最简单的方法为:添加stm32f10x_rcc.c,打开stm32f10x_conf.h 在第41行将/* #include "stm32f10x_rcc.h""*/两边注释符去掉,在main函数中添加代码SystemInit();添加stm32f10x_
现在一般不用2051了,呵呵,不过仿真也没事。这程序可以这样写:设一个变量作为按键的键值,按下为1,再次按下为0;首先写一个流水灯的子程序,然后再主函数里去识别之前设置的键值,=1--->去执行流水灯;=0--->直接
通常的代码如下 uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin){ /*检测是否有按键按下 */ if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)==KEY_ON){ /*等待按键释放 */ while(GPIO_ReadInputDataBit(
简单点的,用表格,事先计算好,放到ROM中,用的时候逐行编译输出就可以。 复杂点的,开一个缓冲区,用循环程序,根据花样的不同,每次填充一行,并输出,然后再计算一下行。除非表格太大,不建议这样用。当单片机接收到按
主要应用到的外设有定时器,GPIO就能够实现流水灯的效果。用定时器做1s的定时中断,在中断程序中进行GPIO 输出高低电平的切换就可以了。
首先要看下《STM32F10xxx参考手册CD00171190.pdf》里关于IO端口的介绍,第8章 通用和复用功能I/O(GPIO和AFIO)百为STM3210E-EVAL开发板上的CPU是STM32F103ZET6,有GPIOA~GPIOG七组IO,每组IO有16个引脚GPIO_Pin_0~
stm32开发板怎么用按键控制流水灯
给你一个最简单的思路 CPU利用率不高但是可以完成 你上面写的我给你提供一个思路 你应该可以看的懂 看不懂追问 unsigned int key;void main(void){ while(1){ switch(key){ case 0: LED0=!LED0;//你自己修改 d
STM32中断实验 实验目的: 掌握中断的配置 连接方法: 用排线或杜邦线分别连 JP10--JP1 JP11--JP5 实验现象: 当K7按下LED灯 再按时,LED灯会熄灭 / include "stm32f10x_lib.h"/*** 变量定义 ---*/ EXTI
我不知道为什么中文复制之后这里变乱码了,所以截图作为参照,代码附在后面:include "sys.h"#include "usart.h"#include "delay.h"#include "led.h" #include "key.h" //°´¼ü´¦À
这就是通信协议的问题了。STM32按照通信协议来控制灯的亮灭罢了 if ( USART_GetITStatus( USART1, USART_IT_RXNE ) != RESET ) //接收中断 { //指令格式为 C5+5C+长度+模式+参数+校验码 Recv =USART_ReceiveData
等到执行到 while(!ReadValue);//等待按键被放开 这条指令时 数据仍然是上次采集到的那个值代表按键按下,(!ReadValue)这个值永远成立,所以无法代表按键断开。所以程序一直卡死在这条指令上。如果要通过就必须在判据里重新
通常的代码如下 uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin){ /*检测是否有按键按下 */ if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)==KEY_ON){ /*等待按键释放 */ while(GPIO_ReadInputDataBit( GP
在stm32里用按键来控制灯的亮灭时如图的一句代码是干吗用的感觉多余,但是注释掉还不对,求大神指教??
这问题问的,LED跟按键有必然的联系吗?除非你功能上用按键控制LED。现在MDK在仿真试试,主要查看一下那些重要的寄存器有没有配置错误或者被其它代码修改等。其实仿真没有问题,就应该怀疑你自己的板子问题。以下可以参考的代码: /*******************普中科技 www.prechin.com********************************** * * STM32中断实验 * * 实验目的: 掌握中断的配置 * 连接方法: 用排线或杜邦线分别连 JP10--JP1 JP11--JP5 * 实验现象: 当K7按下LED灯 再按时,LED灯会熄灭 * *******************************************************************************/ #include "stm32f10x_lib.h" /******************************** 变量定义 ------------------------------------*/ EXTI_InitTypeDef EXTI_InitStructure; ErrorStatus HSEStartUpStatus; /*********************************声明函数 -----------------------------------------------*/ void RCC_Configuration(void); void GPIO_Configuration(void); void NVIC_Configuration(void); /******************************************************************************* * * 主函数 * *******************************************************************************/ int main(void) { #ifdef DEBUG debug(); #endif RCC_Configuration(); //系统时钟配置 NVIC_Configuration(); //NVIC配置 GPIO_Configuration(); //配置GPIO ///*将EXTI线6连接到PB6*/ GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource6); /* Configure Key Button EXTI Line to generate an interrupt on falling edge */ //配置按钮中断线触发方式 EXTI_InitStructure.EXTI_Line = EXTI_Line6; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; //中断线使能 EXTI_Init(&EXTI_InitStructure); //初始化中断 /* Generate software interrupt: simulate a falling edge applied on Key Button EXTI line */ EXTI_GenerateSWInterrupt(EXTI_Line6); //EXTI_Line6中断允许 到此中断配置完成,可以写中断处理函数。 while (1) { } } /******************************************************************************* * * RCC配置 * *******************************************************************************/ void RCC_Configuration(void) { //复位RCC外部设备寄存器到默认值 RCC_DeInit(); //打开外部高速晶振 RCC_HSEConfig(RCC_HSE_ON); //等待外部高速时钟准备好 HSEStartUpStatus = RCC_WaitForHSEStartUp(); //外部高速时钟已经准别好 if(HSEStartUpStatus == SUCCESS) { FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); FLASH_SetLatency(FLASH_Latency_2); //配置AHB(HCLK)时钟=SYSCLK RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置APB2(PCLK2)钟=AHB时钟 RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB1(PCLK1)钟=AHB 1/2时钟 RCC_PCLK1Config(RCC_HCLK_Div2); //配置ADC时钟=PCLK2 1/4 RCC_ADCCLKConfig(RCC_PCLK2_Div4); //配置PLL时钟 == 外部高速晶体时钟*9 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //配置ADC时钟= PCLK2/4 RCC_ADCCLKConfig(RCC_PCLK2_Div4); //使能PLL时钟 RCC_PLLCmd(ENABLE); //等待PLL时钟就绪 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } //配置系统时钟 = PLL时钟 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //检查PLL时钟是否作为系统时钟 while(RCC_GetSYSCLKSource() != 0x08) { } } /* Enable Key Button GPIO Port, GPIO_LED and AFIO clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); } /************************************************* 函数: void GPIO_Config(void) 功能: GPIO配置 **************************************************/ void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输入 GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //配置浮空输入 GPIO_Init(GPIOB, &GPIO_InitStructure); } /******************************************************************************* * Function Name : NVIC_Configuration * Description : Configure the nested vectored interrupt controller. * Input : None * Output : None * Return : None *******************************************************************************/ void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; #ifdef VECT_TAB_RAM /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); //分配中断向量表 #else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif /* Configure one bit for preemption priority */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //设置中断优先级 /* Enable the EXTI9_5 Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel; //中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //强占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//次优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //通道中断使能 NVIC_Init(&NVIC_InitStructure);//初始化中断 } #ifdef DEBUG /******************************************************************************* * Function Name : assert_failed * Description : Reports the name of the source file and the source line number * where the assert_param error has occurred. * Input : - file: pointer to the source file name * - line: assert_param error line source number * Output : None * Return : None *******************************************************************************/ void assert_failed(u8* file, u32 line) { /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* Infinite loop */ while (1) { } } #endif void EXTI9_5_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line6) != RESET) //检测制定的EXTI线路触发请求是否发生。 { /* Toggle GPIO_LED pin 7*/ GPIO_WriteBit(GPIOB, GPIO_Pin_8, (BitAction)((1-GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_8)))); /* Clear the Key Button EXTI line pending bit */ EXTI_ClearITPendingBit(EXTI_Line6); //清除EXTI线路挂起位 } } /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
主要应用到的外设有定时器,GPIO就能够实现流水灯的效果。用定时器做1s的定时中断,在中断程序中进行GPIO 输出高低电平的切换就可以了。
主要应用到的外设有定时器,GPIO就能够实现流水灯的效果。用定时器做1s的定时中断,在中断程序中进行GPIO 输出高低电平的切换就可以了。
Stm32共有11个定时器: 1.两个高级定时器:TIM1、TIM8-------------------------APB2 2.四个通用定时器:TIM2~TIM5-------------------------APB1 3.两个基本定时器:TIM6、TIM7-------------------------APB1 4.两个看门狗 5.一个系统嘀嗒定时器(SysTick) 主程序main.c /* *说明: *PA0:KEY1;PA1:KEY2; *PA2:LED1;PA3:LED2; *PA9:USART1_TX;PA10:USART1_RX */ #include "stm32f10x.h" #include "stm32f10x_rcc.h" #include "stm32f10x_gpio.h" #include "stm32f10x_tim.h" #include "stm32f10x_exti.h" #include "system_stm32f10x.h" #include "misc.h" void RCC_Configuration(void); void GPIO_Configuration(void); void TIM3_Configuration(void); void NVIC_Configuration(void); int main() { SystemInit(); RCC_Configuration(); GPIO_Configuration(); TIM3_Configuration(); NVIC_Configuration(); while(1); } void RCC_Configuration(void) { ////USART2和USART3都在在APB1上而USART1是在APB2上的 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); } void TIM3_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ClearITPendingBit(TIM3, TIM_IT_Update); TIM_TimeBaseStructure.TIM_Period = 2000;//频率:72MHz 72000000/36000=2000 TIM_TimeBaseStructure.TIM_Prescaler = 35999;//36000-1=35999 TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE ); TIM_Cmd(TIM3,ENABLE); } void NVIC_Configuration(void)//配置中断优先级 { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }中断函数stm32f10x_it.c #include "..\include\stm32f10x.h" #include "..\include\stm32f10x_it.h" #include "..\include\stm32f10x_gpio.h" #include "..\include\stm32f10x_tim.h" void TIM3_IRQHandler(void) { TIM_ClearITPendingBit(TIM3, TIM_IT_Update); if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)==Bit_RESET) { GPIO_SetBits(GPIOA,GPIO_Pin_2); }else{ GPIO_ResetBits(GPIOA,GPIO_Pin_2); } }中断函数声明头文件stm32f10x_it.h #ifndef __STM32F10x_IT_H #define __STM32F10x_IT_H /* Includes ------------------------------------------------------------------*/ /* Exported types ------------------------------------------------------------*/ /* Exported constants --------------------------------------------------------*/ /* Exported macro ------------------------------------------------------------*/ /* Exported functions ------------------------------------------------------- */ void NMIException(void); void HardFaultException(void); void MemManageException(void); void BusFaultException(void); void UsageFaultException(void); void DebugMonitor(void); void SVCHandler(void); void PendSVC(void); void SysTickHandler(void); void WWDG_IRQHandler(void); void PVD_IRQHandler(void); void TAMPER_IRQHandler(void); void RTC_IRQHandler(void); void FLASH_IRQHandler(void); void RCC_IRQHandler(void); void EXTI0_IRQHandler(void); void EXTI1_IRQHandler(void); void EXTI2_IRQHandler(void); void EXTI3_IRQHandler(void); void EXTI4_IRQHandler(void); void DMA1_Channel1_IRQHandler(void); void DMA1_Channel2_IRQHandler(void); void DMA1_Channel3_IRQHandler(void); void DMA1_Channel4_IRQHandler(void); void DMA1_Channel5_IRQHandler(void); void DMA1_Channel6_IRQHandler(void); void DMA1_Channel7_IRQHandler(void); void ADC1_2_IRQHandler(void); void USB_HP_CAN_TX_IRQHandler(void); void USB_LP_CAN_RX0_IRQHandler(void); void CAN_RX1_IRQHandler(void); void CAN_SCE_IRQHandler(void); void EXTI9_5_IRQHandler(void); void TIM1_BRK_IRQHandler(void); void TIM1_UP_IRQHandler(void); void TIM1_TRG_COM_IRQHandler(void); void TIM1_CC_IRQHandler(void); void TIM2_IRQHandler(void); void TIM3_IRQHandler(void); void TIM4_IRQHandler(void); void I2C1_EV_IRQHandler(void); void I2C1_ER_IRQHandler(void); void I2C2_EV_IRQHandler(void); void I2C2_ER_IRQHandler(void); void SPI1_IRQHandler(void); void SPI2_IRQHandler(void); void USART1_IRQHandler(void); void USART2_IRQHandler(void); void USART3_IRQHandler(void); void EXTI15_10_IRQHandler(void); void RTCAlarm_IRQHandler(void); void USBWakeUp_IRQHandler(void); void TIM8_BRK_IRQHandler(void); void TIM8_UP_IRQHandler(void); void TIM8_TRG_COM_IRQHandler(void); void TIM8_CC_IRQHandler(void); void ADC3_IRQHandler(void); void FSMC_IRQHandler(void); void SDIO_IRQHandler(void); void TIM5_IRQHandler(void); void SPI3_IRQHandler(void); void UART4_IRQHandler(void); void UART5_IRQHandler(void); void TIM6_IRQHandler(void); void TIM7_IRQHandler(void); void DMA2_Channel1_IRQHandler(void); void DMA2_Channel2_IRQHandler(void); void DMA2_Channel3_IRQHandler(void); void DMA2_Channel4_5_IRQHandler(void); #endif /* __STM32F10x_IT_H */ /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
先定义对应LED 的控制端口#define LED PAout(0)然后LED=~LED;
开发板上4个LED是接到STM32的4个IO口上的,要点亮LED,只要在这4个IO上输出对应的高电平 那如何让STM32在PF6~PF9这4个IO上输出高点平呢 首先要看下《STM32F10xxx参考手册CD00171190.pdf》里关于IO端口的介绍,第8章 通用和复用功能I/O(GPIO和AFIO) 百为STM3210E-EVAL开发板上的CPU是STM32F103ZET6,有GPIOA~GPIOG七组IO,每组IO有16个引脚GPIO_Pin_0~GPIO_Pin_15,如板上的PF0~PF15 其中每个IO端口有2个32位的寄存器(GPIOx_CRL和GPIOx_CRH)配置,每个引脚由其中4位进行配置, 4位字段是由一个两位的配置字段和一个两位的模式字段组成 要设置这4位,要看下GPIOx_CRL,GPIOx_CRH的寄存器定义 由上图可以看出GPIOF_CRL的31~28位是设置PF7的,GPIOF_CRL的27~24位是设置PF6的 GPIOF_CRH的3~0位是设置PF8的,GPIOF_CRH的7~4位是设置PF6的 这里我们把每个引脚设置为 CNF[1:0] = 00:通用推挽输出模式 MODE[1:0] = 11 : 输出模式,最大速度50MH GPIOF_CRL,GPIOF_CRH的寄存器地址分别是0x40011C00,0x40011C04 这个寄存器是怎么得来的,STM32数据手册里并没有直接给出,在《一个内幕者对STM32的介绍》4.1.1 寄存器地址查阅 这里有介绍怎么通过上面的偏移地址算出。 配置好,我们就可以直接在端口输出数据寄存器GPIOF_ODR输出高电平控制LED了,GPIOF_ODR有16位,每个位对应GPF的一个引脚,PF0~PF15 下面就可以编写LED流水灯程序了,激动啊,等了好久终于等到今天 /* main.c */ #define GPIOF_CRL (*(volatile unsigned int *)0x40011C00) //端口配置低寄存器 #define GPIOF_CRH (*(volatile unsigned int *)0x40011C04) //端口配置高寄存器 #define GPIOF_ODR (*(volatile unsigned int *)0x40011C0C) //端口输出数据寄存器 #define RCC_APB2ENR (*(volatile unsigned int *)0x40021018) // void delay(void) { unsigned int i; for(i=0;i<500000;i++); } int main() { int i; RCC_APB2ENR |= 1<<7; //打开GPIOF的时钟 GPIOF_CRL = ( GPIOF_CRL & 0x00ffffff ) | 0x33000000; //配置PF6,PF7为通用推挽输出模式,最大速度50MH GPIOF_CRH = ( GPIOF_CRH & 0xffffff00 ) | 0x00000033; //配置PF8,PF9为通用推挽输出模式,最大速度50MH while(1) { for(i=6;i<=9;i++) { GPIOF_ODR = ( GPIOF_ODR & 0xfffffc3f ) | ( 1<<i ); //在PF6~PF9引脚轮流输出高电平 delay(); } } }
你说的应该是按键触发外部中断的功能吧? 如果是继续往下看:stm32实现功能都是一个套路 配置你所用按键的引脚的GPIO和中断(我这里是以PA0引脚为例,用时候修改为你的引脚) void EXTI_PA0_Config(void){GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* config the extiline clock and AFIO clock */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);/* config the NVIC */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /* 配置中断源 */ NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure); NVIC_Configuration();/* EXTI line gpio config*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入GPIO_Init(GPIOA, &GPIO_InitStructure);/* EXTI line mode config */GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);EXTI_InitStructure.EXTI_Line = EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿中断EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);} 2.经过以上配置,当外部按键中断触发时就会执行,stm32f10x_it.c中的,对应外部中断函数,此时把你需要进行的操作加入函数中(比如点亮熄灭led) void EXTI0_IRQHandler(void){if (EXTI_GetITStatus(EXTI_Line0) != RESET) {//确保是否产生了 EXTI Line 中断// LED1 取反LED1_TOGGLE;//这里需要改为你要实现的功能,EXTI_ClearITPendingBit(EXTI_Line0);//清除中断标志位} }