用C语言写基于STM32f103c8t6的流水灯程序
时间: 2023-10-03 22:04:00 浏览: 101
以下是一个基于 STM32f103c8t6 的流水灯程序,使用了 HAL 库:
```c
#include "stm32f1xx_hal.h"
#define LED_NUM 8 // LED 数量
#define DELAY_MS 1000 // 延迟时间
int main(void) {
HAL_Init(); // 初始化 HAL 库
// 初始化时钟
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
Error_Handler();
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {
Error_Handler();
}
// 初始化 GPIO
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_13; // PC13 为板载 LED
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 循环流水灯
uint16_t pin[LED_NUM] = {GPIO_PIN_0, GPIO_PIN_1, GPIO_PIN_2, GPIO_PIN_3,
GPIO_PIN_4, GPIO_PIN_5, GPIO_PIN_6, GPIO_PIN_7};
int i;
while (1) {
for (i = 0; i < LED_NUM; i++) {
HAL_GPIO_WritePin(GPIOA, pin[i], GPIO_PIN_SET); // 点亮当前 LED
HAL_Delay(DELAY_MS); // 延迟
HAL_GPIO_WritePin(GPIOA, pin[i], GPIO_PIN_RESET); // 熄灭当前 LED
}
}
return 0;
}
void Error_Handler(void) {
// 错误处理函数
}
```
此程序使用了 STM32CubeMX 工具生成的 HAL 库代码。在编译前需要先安装 STM32CubeMX 工具,生成工程代码,并在工程中添加 HAL 库的源代码和头文件。编译器可以选择 Keil MDK 或者 GNU ARM Toolchain。
阅读全文