stm32g030c8t6程序例程标准库
时间: 2025-06-17 15:39:47 浏览: 15
### STM32G030C8T6 标准库程序例程
STM32G030C8T6 是一款基于 ARM Cortex-M0+ 内核的微控制器,广泛应用于嵌入式系统开发。虽然官方更推荐使用 HAL 库进行开发,但标准外设库(Standard Peripheral Library)仍然是一种高效的开发方式,尤其对于需要优化资源和性能的应用场景。
以下是一个基于标准库实现的简单程序例程,用于配置串口外部中断读取 ADC 值,并通过串口打印五向按键的方向信息[^1]。
#### 代码示例:五向按键方向检测与串口打印
```c
#include "stm32g0xx.h"
// 全局变量用于存储ADC值
uint16_t adcValue;
// 初始化串口USART1
void USART_Init(void) {
RCC->AHBENR |= RCC_AHBENR_GPIOAEN; // 使能GPIOA时钟
RCC->APB2ENR |= RCC_APB2ENR_USART1EN; // 使能USART1时钟
// 配置PA9为复用推挽输出 (TX)
GPIOA->MODER &= ~(GPIO_MODER_MODE9_Msk);
GPIOA->MODER |= GPIO_MODER_MODE9_1;
GPIOA->OTYPER &= ~GPIO_OTYPER_OT_9;
GPIOA->OSPEEDR |= GPIO_OSPEEDR_SPEED9_0 | GPIO_OSPEEDR_SPEED9_1;
GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPD9_Msk);
// 配置PA10为复用推挽输入 (RX)
GPIOA->MODER &= ~(GPIO_MODER_MODE10_Msk);
GPIOA->MODER |= GPIO_MODER_MODE10_1;
GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPD10_Msk);
USART1->BRR = 0x1D4C; // 波特率设置为115200
USART1->CR1 |= USART_CR1_TE | USART_CR1_RE | USART_CR1_UE;
}
// 发送字符串函数
void USART_SendString(char *str) {
while (*str) {
while (!(USART1->ISR & USART_ISR_TXE));
USART1->TDR = (uint8_t)(*str++);
}
}
// 初始化ADC
void ADC_Init(void) {
RCC->AHBENR |= RCC_AHBENR_GPIOAEN; // 使能GPIOA时钟
RCC->APB2ENR |= RCC_APB2ENR_ADCEN; // 使能ADC时钟
// 配置PA1为模拟输入
GPIOA->MODER &= ~(GPIO_MODER_MODE1_Msk);
GPIOA->MODER |= GPIO_MODER_MODE1_0;
ADC->CFGR1 &= ~(ADC_CFGR1_DMAEN | ADC_CFGR1_DISCEN); // 禁用DMA和序列扫描模式
ADC->SMPR1 |= ADC_SMPR1_SMP1_0 | ADC_SMPR1_SMP1_1; // 设置采样时间为16.5个周期
ADC->CHSELR |= ADC_CHSELR_CHSEL1; // 选择通道1 (PA1)
ADC->CFGR1 |= ADC_CFGR1_CONT; // 启用连续转换模式
ADC->CR |= ADC_CR_ADEN; // 启用ADC
}
// 读取ADC值
uint16_t ADC_Read(void) {
ADC->CR |= ADC_CR_ADSTART; // 开始转换
while (!(ADC->ISR & ADC_ISR_EOC)); // 等待转换完成
return ADC->DR; // 返回转换结果
}
// 初始化外部中断
void EXTI_Init(void) {
RCC->AHBENR |= RCC_AHBENR_GPIOAEN; // 使能GPIOA时钟
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; // 使能SYSCFG时钟
// 配置PA8为输入模式
GPIOA->MODER &= ~(GPIO_MODER_MODE8_Msk);
GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPD8_Msk);
SYSCFG->EXTICR[2] |= SYSCFG_EXTICR3_EXTI8_PA; // 将EXTI8映射到PA8
EXTI->RTSR1 |= EXTI_RTSR1_RT8; // 上升沿触发
EXTI->IMR1 |= EXTI_IMR1_IM8; // 使能EXTI8中断
NVIC_EnableIRQ(EXTI4_15_IRQn); // 使能EXTI4-15中断
}
// 外部中断处理函数
void EXTI4_15_IRQHandler(void) {
if (EXTI->PR1 & EXTI_PR1_PIF8) { // 检查是否是EXTI8中断
EXTI->PR1 |= EXTI_PR1_PIF8; // 清除中断标志
adcValue = ADC_Read(); // 读取ADC值
// 判断按键方向并发送串口信息
if (adcValue < 500) {
USART_SendString("Up\r\n");
} else if (adcValue < 1500) {
USART_SendString("Down\r\n");
} else if (adcValue < 2500) {
USART_SendString("Left\r\n");
} else if (adcValue < 3500) {
USART_SendString("Right\r\n");
} else {
USART_SendString("Center\r\n");
}
}
}
int main(void) {
USART_Init(); // 初始化串口
ADC_Init(); // 初始化ADC
EXTI_Init(); // 初始化外部中断
while (1) {
// 主循环中无需操作
}
}
```
### 说明
上述代码实现了以下功能:
1. 配置 PA8 作为外部中断引脚,当五向按键被按下时触发上升沿中断。
2. 在中断处理函数中读取 PA1 的 ADC 值,根据不同的 ADC 值判断按键的方向。
3. 通过串口将按键的方向信息打印出来[^1]。
---
阅读全文
相关推荐



















