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

[复制链接]
1895|45
 楼主| wangtaohui 发表于 2023-11-23 23:32 | 显示全部楼层
4、GPIO应用程序
application.c

  1. #include "led.h"
  2. #include "key.h"
  3. #include "buzzer.h"
  4. #define MAX_VOL 20
  5. #define MIN_VOL 1

  6. int main(void){
  7.         unsigned char volume = 10;
  8.         //周期计数,忽略键盘扫描,用于蜂鸣器控制
  9.         //如volume = 10,即20个周期有10个输出高电平
  10.         unsigned char cycle = 0;
  11.         led_operate(0,1);
  12.         led_operate(1,1);
  13.         led_operate(2,1);
  14.         led_operate(3,1);
  15.         while(1){
  16.                 unsigned char key_site = scan_keyboard(); //扫描按键状态
  17.                 char led_status = -1;
  18.                 //延迟10ms给蜂鸣器一个响应时间,否则在Proteus仿真环境下蜂鸣器可能由于得不到(电脑的)CPU而不响
  19.                 delayms(10);       
  20.                 cycle++;
  21.                 switch(key_site){
  22.                                 case 0:                                                                                                        //按键一被按了一次
  23.                                                 led_status = get_led_status(0);
  24.                                                 if(led_status == 0){
  25.                                                                 led_operate(0,1);                                                //D1状态改变
  26.                                                 }else if(led_status == 1){
  27.                                                                 led_operate(0,0);                                                //D1状态改变
  28.                                                 }
  29.                                                 break;
  30.                                 case 1:
  31.                                                 led_status = get_led_status(1);
  32.                                                 if(led_status == 0){
  33.                                                                 led_operate(1,1);                                                //D2状态改变
  34.                                                 }else if(led_status == 1){
  35.                                                                 led_operate(1,0);                                                //D2状态改变
  36.                                                 }
  37.                                                 break;
  38.                                        
  39.                                 case 2:
  40.                                                 led_status = get_led_status(2);
  41.                                                 if(led_status == 0){
  42.                                                                 led_operate(2,1);                                                //D3状态改变
  43.                                                 }else if(led_status == 1){
  44.                                                                 led_operate(2,0);                                                //D3状态改变
  45.                                                 }
  46.                                                 break;
  47.                                        
  48.                                 case 3:
  49.                                                 led_status = get_led_status(3);
  50.                                                 if(led_status == 0){
  51.                                                                 led_operate(3,1);                                                //D4状态改变
  52.                                                 }else if(led_status == 1){
  53.                                                                 led_operate(3,0);                                                //D4状态改变
  54.                                                 }
  55.                                                 break;
  56.                                 case 4:                                                                                                        //蜂鸣器音量+
  57.                                                 if(volume < MAX_VOL){
  58.                                                         volume++;
  59.                                                 }
  60.                                                 break;
  61.                                
  62.                                 case 5:                                                                                                        //蜂鸣器音量-
  63.                                                 if(volume > MIN_VOL){
  64.                                                         volume--;
  65.                                                 }
  66.                                                 break;
  67.                                         default:
  68.                                                 break;
  69.                 }
  70.                 if(cycle >= 0){
  71.                         buzzer_open();
  72.                 }if(cycle >= volume){
  73.                         buzzer_off();
  74.                 }if(cycle >= (MAX_VOL+1)){
  75.                         cycle = 0;
  76.                 }
  77.         }
  78.         return 0;
  79. }
 楼主| wangtaohui 发表于 2023-11-23 23:32 | 显示全部楼层
在Proteus仿真中蜂鸣器的音量变化不太明显,所以在蜂鸣器电路中加了个指示灯。调整音量的时候可以看到指示灯一个周期内亮灭时间变化。音量越大亮的时间越长。
 楼主| wangtaohui 发表于 2023-11-23 23:32 | 显示全部楼层
5、编译并仿真
5.1、编译出hex文件。其生成位置在Keil5_STM32F401VE_GPIO_Project\Objects
53493655f709e8f1f5.png
 楼主| wangtaohui 发表于 2023-11-23 23:33 | 显示全部楼层
5.2、双击STM32F401VE芯片,加载hex文件


17747655f70ac63f1c.png
 楼主| wangtaohui 发表于 2023-11-23 23:33 | 显示全部楼层
此外STM32还有很多开发方式。如基于标准外设库SPL开发、基于HAL开发。还可以使用Eclipse C++进行开发、使用Linux交叉编译进行开发等等。
 楼主| wangtaohui 发表于 2023-11-23 23:33 | 显示全部楼层
三、资料下载
源码与仿真电路下载地址:https://download.csdn.net/download/qq_54140018/87687153

芯片手册与参考资料下载地址:https://download.csdn.net/download/qq_54140018/87687152
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部