历史上的今天
今天是:2026年03月20日(星期五)
2023年03月20日 | STM32CubeMX系列 | 跑马灯
2023-03-20 来源:zhihu
跑马灯
1. GPIO口简介
每个GPIO端口有两个32位配置寄存器(GPIOx_CRL和GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR) GPIO端口的每个位可以由软件分别配置成多种模式:输入浮空、输入上拉、输入下拉、模拟输入、开漏输出、推挽式输出、推挽式复用功能以及开漏复用功能 I/O端口位的基本结构如下图示

2. 硬件设计
LED(D0~D7)一端接上拉3.3V,另一端依次接到STM32F103的PC0-PC7引脚,本实验只使用D1和D2,连接原理图如下:

3. 软件设计
3.1 STM32CubeMX设置
RCC设置外接HSE,时钟设置为72M
PC0和PC2设置为GPIO推挽输出模式、上拉、高速、默认输出电平为高电平

输入工程名,选择工程路径(不要有中文),选择MDK-ARM V5;勾选Generated periphera initialization as a pair of ‘.c/.h’ files per IP ;点击GENERATE CODE,生成工程代码
3.2 MDK-ARM软件编程
在gpio.c文件中可以看到PC0/PC1管脚的初始化函数
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOC时钟
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOC, LED1_Pin|LED2_Pin, GPIO_PIN_SET); //PC0和PC1置1,默认初始化后灯灭
/*Configure GPIO pins : PCPin PCPin */
GPIO_InitStruct.Pin = LED1_Pin|LED2_Pin; //PC0和PC1
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_InitStruct.Pull = GPIO_PULLUP; //上拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; //高速
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}
在main.c函数中编写跑马灯程序(注意编写的程序应该在相应的USER CODE范围内,否则再次使用CubeMX修改配置时,USER CODE范围之外的程序会被清除)
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_RESET); //LED1亮
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET); //LED1灭
HAL_Delay(500); //延时500ms
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_RESET); //LED2亮
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET); //LED2灭
HAL_Delay(500); //延时500ms
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
4. 下载验证
编译工程得到如下结果:

从以上编译信息可以看出,我们的代码占用FLASH大小为:2956字节(2604+352),所用的SRAM大小为:1040字节(16+1024) 以下是编译结果里面的几个数据的含义: -Code:表示程序所占用FLASH的大小(FLASH) -RO-data:即Read Only-data,表示程序定义的常量(FLASH) -RW-data:即Read Write-data,表示已被初始化的变量(SRAM) -ZI-data:即Zero Init-data,表示未被初始化的变量(SRAM) 有了这个就可以知道你当前使用的flash和sram大小了,所以一定要注意的是程序的大小不是.hex文件的大小,而是编译后的Code和RO-data之和
选择相应的仿真器下载程序
史海拾趣
|
方波有源滤波器谐波电流检测的一种新方法 随着电力电子技术的发展,电力电子装置的应用日益广泛,引起的电网谐波污染也日趋严重[1][2]。因此,对电网谐波采取有效的抑制并对无功功率进行动态补偿已成为重要的研究方向。 采用电力滤波装置就近吸收谐 ...… 查看全部问答> |
|
快拿到论坛的试用LM3S8962开发板了,心里很激动,搜集了好多资料,准备好好学习TI M3。俗话说工欲善其事必先利其器,好的开发工具能提高开发效率,由于学51时就用KEIL软件,所以对KEIL软件情有独钟,现在开始学习ARM了,还是选择KEIL,看到大家写了 ...… 查看全部问答> |
|
在ISE11.1上建立的工程,管脚位置稍做改动,工程运行要么运行通不过,报错:时序无法满足或者有信号线无法布线,即使运行通过了时序也有几个不满足,在改动之前是没有时序错误的,管脚位置变后,就不行了,这是怎么回事呀?感觉工程好像很脆弱,稍 ...… 查看全部问答> |
|
【制作日期】2005 啥时候了? 【板层数】 4【描述】 ADI公司推出频率合成器AD9858,它是第一个具有1GSPS(千兆次取样/秒)直接数字合成器(DDS),10位D/A转换器,快速频率跳跃和精细调谐分辨率功能的单片解决方案。AD9 ...… 查看全部问答> |
|
TI6763: error:: system error, can\'t open file \'w.obj\' for input: No such file or dire 请问这是为什么啊?… 查看全部问答> |
|
脉冲周期大约0.1S,TimerA时钟为分频后的1M。有2组计数,每次发出脉冲,触发中断后n7或者n8 +1;请教给位我的问题出在哪里?谢谢。 [ 本帖最后由 simonprince 于 2012-5-8 09:35 编辑 ]… 查看全部问答> |




