STM32实战
001–C8T6代码移植到CET6
- 修改启动文件
- 将C8T6的启动文件改为CET6的(即中等容量md.s改为hd.s)
- 我的hd.s文件在D:\keil5MDK\destination\Packs\Keil\STM32F1xx_DFP\2.4.0\Boards\Keil\MCBSTM32E\Blinky\RTE\Device\STM32F103ZE\startup_stm32f10x_hd.s
2.修改魔术棒
- 下载器
002–LED闪灯
函数GPIO_SetBits
设定指定的数据端口位为高电平
STM32中的延时函数使用的是系统的嘀嗒计时器计时
GPIO_WriteBit(LEDPORT, LED1,Bit_SET); //LED1接口输出高电平1 LED1是PC13
delay_ms(300);
GPIO_WriteBit(LEDPORT, LED1,Bit_RESET); //LED1接口输出低电平0
delay_s(1);
函数GPIO_ResetBits
清除指定的数据端口位为低电平
GPIO_RestBits(GPIOx,GPIO_Pin_x);
函数GPIO_WriteBit
设置或者清除指定的数据端口位
函数GPIO_Write
向指定GPIO数据端口写入数据
- 0X 16进制;0 8进制
003–按键控制LED(带FLASH)
- FLASH_W(FLASH_START_ADDR,a);写入的a必须是16位的,所以u16 a=0;
- 写入的地址不能与程序冲突。写入的程序从第0页开始,为了不影响程序运行,写入的起始页应选择靠后的页数
#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "flash.h"
#define FLASH_START_ADDR 0x0801f000 //写入的起始地址
void KEY_judge(void);//函数的声明
u16 a; //定义变量
int main (void){//主程序
//初始化程序
RCC_Configuration(); //时钟设置
LED_Init();//LED初始化
KEY_Init();//按键初始化
a = FLASH_R(FLASH_START_ADDR);//从指定页的地址读FLASH
KEY_judge();
//主循环
while(1){
//示例4:有锁存
if(!GPIO_ReadInputDataBit(KEYPORT,KEY2)){ //读按键接口的电平
delay_ms(20); //延时20ms去抖动
if(!GPIO_ReadInputDataBit(KEYPORT,KEY2))
{ //读按键接口的电平
//在2个LED上显示二进制加法
a++; //变量加1
KEY_judge();
FLASH_W(FLASH_START_ADDR,a); //从指定页的地址写入FLASH
while(!GPIO_ReadInputDataBit(KEYPORT,KEY2)); //等待按键松开
}
}
}
}
void KEY_judge(void)
{
if(a>3)
a=1;
if(a==1)
GPIO_Write(LEDPORT,0X4);
else if(a==2)
GPIO_Write(LEDPORT,0X8);
else if(a==3)
GPIO_Write(LEDPORT,0XC);
}
004–蜂鸣器驱动程序
两种蜂鸣器从外观上看几乎没有区别,要通过型号分辨
有源蜂鸣器
- 内置频率发生电路
- 通电就能发出声音
- 声音频率固定
- 成本较高
无源蜂鸣器
- 内部没有发生电路
- 需要外部给予频率
- 可产生不同频率声音
- 成本低
- 修改延时时长可修改声音频率,即音调,时间越短音调越高。经典提示音:1KHz声音,每秒1000个周期,即每个周期1000us。
三极管
- B到E箭头方向有小电流时,则C到E会有大电流。即NPN三极管的基极为高电平时三极管导通
- PNP三极管的基极为低电平时三极管导通。
在这里插入代码片