一:编译第一个程序
int main() //主函数 { } void SystemInit() //在执行主函数前,会被调用。不进行实现。在启动文件中被调用 { }
; Reset handler Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT __main IMPORT SystemInit LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP
二:LED灯原理图
注意:其中PB0是绿灯
三:LED点亮--代码实现
(一)第一步:点亮LED灯PB0引脚绿灯,必须设置端口输出数据寄存器,使得其对应的引脚输出低电平,产生电压差。点亮绿灯
*(unsigned int*)(0x40010c0c) &= ~(1<<0);
(二)第二步: 需要设置端口低寄存器,设置低八位0-7,设置为通用推挽输出模式,最大速度设置为10MHZ
*(unsigned int*)(0x40010c00) |= (1<<0);
开漏和推挽区别在于:
开漏:输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内)。
推挽输出:可以输出高,低电平,连接数字器件。
开漏电路就是指以MOS FET的漏极为输出的电路。一般的用法是会在漏极外部的电路添加上拉电阻。完整的开漏电路应该由开漏器件和开漏上拉电阻组成。
推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止
引入一句话:“复用输出当前的引脚功能功能有外设控制,并不由通用IO控制,因此你要通过操作GPIO来驱动LED的话,肯定是用通用的”
速度可以随便选择
(三)第三步:设置外设GPIOB端口的时钟开启
*(unsigned int*)(0x40021018) |= (1<<3);
(四)全部代码
int main() { *(unsigned int*)(0x40021018) |= (1<<3); *(unsigned int*)(0x40010c00) |= (1<<0); *(unsigned int*)(0x40010c0c) &= ~(1<<0); } void SystemInit() { }