发新帖我要提问
123
返回列表
打印
[STM32F4]

从51到ARM裸机开发实验(004)STM32F401VE GPIO实验

[复制链接]
楼主: wangtaohui
手机看帖
扫描二维码
随时随地手机跟帖
41
wangtaohui|  楼主 | 2023-11-23 23:32 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
4、GPIO应用程序
application.c

#include "led.h"
#include "key.h"
#include "buzzer.h"
#define MAX_VOL 20
#define MIN_VOL 1

int main(void){
        unsigned char volume = 10;
        //周期计数,忽略键盘扫描,用于蜂鸣器控制
        //如volume = 10,即20个周期有10个输出高电平
        unsigned char cycle = 0;
        led_operate(0,1);
        led_operate(1,1);
        led_operate(2,1);
        led_operate(3,1);
        while(1){
                unsigned char key_site = scan_keyboard(); //扫描按键状态
                char led_status = -1;
                //延迟10ms给蜂鸣器一个响应时间,否则在Proteus仿真环境下蜂鸣器可能由于得不到(电脑的)CPU而不响
                delayms(10);       
                cycle++;
                switch(key_site){
                                case 0:                                                                                                        //按键一被按了一次
                                                led_status = get_led_status(0);
                                                if(led_status == 0){
                                                                led_operate(0,1);                                                //D1状态改变
                                                }else if(led_status == 1){
                                                                led_operate(0,0);                                                //D1状态改变
                                                }
                                                break;
                                case 1:
                                                led_status = get_led_status(1);
                                                if(led_status == 0){
                                                                led_operate(1,1);                                                //D2状态改变
                                                }else if(led_status == 1){
                                                                led_operate(1,0);                                                //D2状态改变
                                                }
                                                break;
                                       
                                case 2:
                                                led_status = get_led_status(2);
                                                if(led_status == 0){
                                                                led_operate(2,1);                                                //D3状态改变
                                                }else if(led_status == 1){
                                                                led_operate(2,0);                                                //D3状态改变
                                                }
                                                break;
                                       
                                case 3:
                                                led_status = get_led_status(3);
                                                if(led_status == 0){
                                                                led_operate(3,1);                                                //D4状态改变
                                                }else if(led_status == 1){
                                                                led_operate(3,0);                                                //D4状态改变
                                                }
                                                break;
                                case 4:                                                                                                        //蜂鸣器音量+
                                                if(volume < MAX_VOL){
                                                        volume++;
                                                }
                                                break;
                               
                                case 5:                                                                                                        //蜂鸣器音量-
                                                if(volume > MIN_VOL){
                                                        volume--;
                                                }
                                                break;
                                        default:
                                                break;
                }
                if(cycle >= 0){
                        buzzer_open();
                }if(cycle >= volume){
                        buzzer_off();
                }if(cycle >= (MAX_VOL+1)){
                        cycle = 0;
                }
        }
        return 0;
}

使用特权

评论回复
42
wangtaohui|  楼主 | 2023-11-23 23:32 | 只看该作者
在Proteus仿真中蜂鸣器的音量变化不太明显,所以在蜂鸣器电路中加了个指示灯。调整音量的时候可以看到指示灯一个周期内亮灭时间变化。音量越大亮的时间越长。

使用特权

评论回复
43
wangtaohui|  楼主 | 2023-11-23 23:32 | 只看该作者
5、编译并仿真
5.1、编译出hex文件。其生成位置在Keil5_STM32F401VE_GPIO_Project\Objects

使用特权

评论回复
44
wangtaohui|  楼主 | 2023-11-23 23:33 | 只看该作者
5.2、双击STM32F401VE芯片,加载hex文件


使用特权

评论回复
45
wangtaohui|  楼主 | 2023-11-23 23:33 | 只看该作者
此外STM32还有很多开发方式。如基于标准外设库SPL开发、基于HAL开发。还可以使用Eclipse C++进行开发、使用Linux交叉编译进行开发等等。

使用特权

评论回复
46
wangtaohui|  楼主 | 2023-11-23 23:33 | 只看该作者
三、资料下载
源码与仿真电路下载地址:https://download.csdn.net/download/qq_54140018/87687153

芯片手册与参考资料下载地址:https://download.csdn.net/download/qq_54140018/87687152

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则