完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
硬件接线及开发环境介绍
硬件平台 stm32最小系统 软件平台 Keil uVision5 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。 接线图 继电器模块 relay.c #include "relay.h" #include "stm32f10x.h" // Device header void Relay_Init(void) { GPIO_InitTypeDef Relay_init ; //1.使能GPIOA时钟 接入PA3口 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE); //2.GPIOA3结构体配置 Relay_init.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出 Relay_init.GPIO_Pin = GPIO_Pin_3; Relay_init.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init( GPIOA , &Relay_init); } 单独新建立relay文件夹,里面新建relay.c和relay.h两个文件,先将relay.c文件添加到USER里面,写完第一句代码#include "relay.h"直接编译,relay.h会自动包含到relay.c的子目录下。 若头文件和.c文件不在同一个文件目录下编译将提示找不到头文件,需要手动添加头文件路径。 relay.h #include "stm32f10x.h" void Relay_Init(void);//先声明,再定义,再调用 震动感应模块 shake.c #include "shake.h" #include "stm32f10x.h" // Device header void Shake_Init(void) { GPIO_InitTypeDef Shake_init; //1.打开我们的GPIOA时钟 连接PA1引脚 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //2.配置GPIOA1的配置 Shake_init.GPIO_Mode = GPIO_Mode_IPD; //震动传感器初始为高电平,有振动就为低电平 检测从高电平到低电平的变化 所以用下拉模式(这个表述不是很懂) Shake_init.GPIO_Pin = GPIO_Pin_1; Shake_init.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init( GPIOA, &Shake_init); } shake.h #include "stm32f10x.h" void Shake_Init(void); 中断配置 中断相关的理论介绍参见我的这篇博文:STM32外部中断EXTI简介 exti.c #include "exti.h" #include "stm32f10x.h" // Device header void Exti_Init(void) { //1.配置GPIO GPIO_InitTypeDef Shake_init; //gpio.h EXTI_InitTypeDef Exti_init; //exti.h NVIC_InitTypeDef Nvic_init; //misc.h RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIO的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //GPIOA的中断复用 使能时钟 /*设置IO口与中断线的映射关系*/ GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1); //gpio.h 配置的外部中断源是GPIOA1 是shake震动传感器(GPIOA pin1的复用) //中断优先级组选第1组(有一张图片介绍) NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置NVIC中断组 Shake_init.GPIO_Mode = GPIO_Mode_IPD; //震动传感器初始为高电平 所以用下拉模式 拉到低电平(不是很懂) Shake_init.GPIO_Pin = GPIO_Pin_1; Shake_init.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init( GPIOA, &Shake_init); // 初始化中断线、触发方式等 Exti_init.EXTI_Line = EXTI_Line1; //中断线 因为我们用到的中断源是GPIOA1 所以中断线选择Line1 Exti_init.EXTI_LineCmd = ENABLE; //选使能 还一种是静止模式 Exti_init.EXTI_Mode = EXTI_Mode_Interrupt;//选择中断模式 还一种是事件模式 Exti_init.EXTI_Trigger = EXTI_Trigger_Falling;//振动传感器有振动源————>高电平到底电平 所以选择下降沿触发 EXTI_Init(&Exti_init); ///*配置中断分组(NVIC),并使能中断*/ 在misc.h里 Nvic_init.NVIC_IRQChannel = EXTI1_IRQn; //中断通道 因为我们用到的中断源是GPIOA1所以选择中断通道1 Nvic_init.NVIC_IRQChannelCmd = ENABLE; //使能 找到FunctionalState字眼 右键goto Nvic_init.NVIC_IRQChannelPreemptionPriority = 1; //因为只配置了一个中断 不考虑优先级 所以只有1个 Nvic_init.NVIC_IRQChannelSubPriority = 1; //抢占优先级 从优先级 都是1 NVIC_Init(&Nvic_init);//中断初始化函数 //4.编写中断服务函数 写在main函数里面了 } exti.h #include "stm32f10x.h" void Exti_Init(void); 1 2 3 主函数 main.c #include "stm32f10x.h" // Device header #include "relay.h"//这个会找不到头文件,需要手动添加头文件路径 点击魔术棒——选择C/C++——include path #include "shake.h"//下同 #include "exti.h" void delay(uint16_t time) { uint16_t i = 0; while(time--) { i=12000; while(i--); } } int main(void) { LED_Init(); Relay_Init(); Shake_Init(); Exti_Init(); GPIO_SetBits(GPIOA , GPIO_Pin_3); //初始化继电器为关闭状态 // 下面这部分没有使用外部中断,直接While()死循环检测振动模块电平,从而控制灯的亮灭(继电器) // while(1) // { // //if内部判断是否发生电平变化 // if(GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_1) == 0) //如果发生震动 // { // GPIO_ResetBits(GPIOA , GPIO_Pin_3); //开灯 // delay(1000); //持续一秒 // GPIO_SetBits(GPIOA , GPIO_Pin_3); //关灯 // }else{ // GPIO_SetBits(GPIOA , GPIO_Pin_3); // } // GPIO_ResetBits( GPIOA, GPIO_Pin_3); // delay(1000); // GPIO_SetBits(GPIOA , GPIO_Pin_3); // GPIO_ResetBits(GPIOC , GPIO_Pin_13); //void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); // delay(1000); //1s // GPIO_SetBits(GPIOC , GPIO_Pin_13); // delay(1000); } } //4.中断服务函数 中断的好处:不用一直while()死循环,一直占用CPU void EXTI1_IRQHandler(void)//在启动文件里 { if (EXTI_GetITStatus( EXTI_Line1 ) != RESET) //判断是否发生了中断 右键 EXTI_GetITStatus goto //在exit.h { GPIO_ResetBits(GPIOA , GPIO_Pin_3); //打开继电器,开灯 delay(1000); GPIO_SetBits(GPIOA , GPIO_Pin_3); //关闭继电器,关灯 } EXTI_ClearFlag( EXTI_Line1);//清除中断标志 不然标志位一直都存在 在exit.h } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1618 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1545 浏览 1 评论
979 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1597 浏览 2 评论
1864浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
645浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
516浏览 3评论
532浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
505浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 17:45 , Processed in 1.136192 second(s), Total 49, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号