stm32l476 例程
时间: 2023-09-20 15:03:40 浏览: 134
stm32的例程
以下是STM32L476的几个例程:
1. LED闪烁
这个例程会让板子上的LED灯不停地闪烁。
```c
#include "stm32l4xx.h"
#include "stm32l476xx.h"
int main(void)
{
RCC->AHB2ENR |= RCC_AHB2ENR_GPIOAEN; // 使能 GPIOA 时钟
GPIOA->MODER &= ~GPIO_MODER_MODE5_Msk; // 清空第5位(LED引脚)的 MODER 寄存器
GPIOA->MODER |= GPIO_MODER_MODE5_0; // 将第5位设置为输出模式
while (1) {
GPIOA->ODR ^= GPIO_ODR_OD5; // 反转 LED 引脚状态
for (int i = 0; i < 200000; i++) {} // 稍微延时一下
}
}
```
2. 串口输出
这个例程会在串口终端上输出 "Hello, world!"。
```c
#include "stm32l4xx.h"
#include "stm32l476xx.h"
void USART2_Init(void)
{
RCC->APB1ENR1 |= RCC_APB1ENR1_USART2EN; // 使能 USART2 时钟
RCC->AHB2ENR |= RCC_AHB2ENR_GPIOAEN; // 使能 GPIOA 时钟
GPIOA->MODER &= ~(GPIO_MODER_MODE2_Msk | GPIO_MODER_MODE3_Msk); // 清空第2、3位(USART2引脚)的 MODER 寄存器
GPIOA->MODER |= GPIO_MODER_MODE2_1 | GPIO_MODER_MODE3_1; // 将第2、3位设置为复用模式
GPIOA->AFR[0] &= ~(GPIO_AFRL_AFSEL2_Msk | GPIO_AFRL_AFSEL3_Msk); // 清空第2、3位(USART2引脚)的 AFR 寄存器
GPIOA->AFR[0] |= (7U << GPIO_AFRL_AFSEL2_Pos) | (7U << GPIO_AFRL_AFSEL3_Pos); // 将第2、3位设置为 AF7(USART2)
USART2->BRR = 4000000 / 115200; // 设置波特率为 115200
USART2->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE; // 使能发送和接收,使能 USART2
}
void USART2_sendChar(char ch)
{
while (!(USART2->ISR & USART_ISR_TXE_Msk)) {} // 等待发送缓冲区为空
USART2->TDR = ch; // 发送字符
}
int main(void)
{
USART2_Init();
while (1) {
USART2_sendChar('H');
USART2_sendChar('e');
USART2_sendChar('l');
USART2_sendChar('l');
USART2_sendChar('o');
USART2_sendChar(',');
USART2_sendChar(' ');
USART2_sendChar('w');
USART2_sendChar('o');
USART2_sendChar('r');
USART2_sendChar('l');
USART2_sendChar('d');
USART2_sendChar('!');
USART2_sendChar('\r');
USART2_sendChar('\n');
}
}
```
3. ADC采样
这个例程会在ADC1通道0上进行采样,并在串口终端上输出采样值。
```c
#include "stm32l4xx.h"
#include "stm32l476xx.h"
void USART2_Init(void)
{
RCC->APB1ENR1 |= RCC_APB1ENR1_USART2EN; // 使能 USART2 时钟
RCC->AHB2ENR |= RCC_AHB2ENR_GPIOAEN; // 使能 GPIOA 时钟
GPIOA->MODER &= ~(GPIO_MODER_MODE2_Msk | GPIO_MODER_MODE3_Msk); // 清空第2、3位(USART2引脚)的 MODER 寄存器
GPIOA->MODER |= GPIO_MODER_MODE2_1 | GPIO_MODER_MODE3_1; // 将第2、3位设置为复用模式
GPIOA->AFR[0] &= ~(GPIO_AFRL_AFSEL2_Msk | GPIO_AFRL_AFSEL3_Msk); // 清空第2、3位(USART2引脚)的 AFR 寄存器
GPIOA->AFR[0] |= (7U << GPIO_AFRL_AFSEL2_Pos) | (7U << GPIO_AFRL_AFSEL3_Pos); // 将第2、3位设置为 AF7(USART2)
USART2->BRR = 4000000 / 115200; // 设置波特率为 115200
USART2->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE; // 使能发送和接收,使能 USART2
}
void ADC1_Init(void)
{
RCC->AHB2ENR |= RCC_AHB2ENR_GPIOAEN; // 使能 GPIOA 时钟
RCC->APB2ENR |= RCC_APB2ENR_ADCEN; // 使能 ADC 时钟
GPIOA->MODER |= GPIO_MODER_MODE0_Msk; // 将第0位设置为模拟输入模式
ADC1->CR &= ~ADC_CR_ADEN_Msk; // 关闭 ADC1
for (int i = 0; i < 10000; i++) {} // 稍微等待一下
ADC1->CFGR &= ~(ADC_CFGR_RES_Msk | ADC_CFGR_ALIGN_Msk); // 12位分辨率,右对齐
ADC1->SQR1 &= ~ADC_SQR1_L_Msk; // 1个通道
ADC1->SQR1 |= ADC_SQR1_SQ1_0; // 选择通道0
ADC1->CR |= ADC_CR_ADEN; // 使能 ADC1
while (!(ADC1->ISR & ADC_ISR_ADRDY_Msk)) {} // 等待 ADC1 准备好
}
int main(void)
{
USART2_Init();
ADC1_Init();
while (1) {
ADC1->CR |= ADC_CR_ADSTART; // 开始采样
while (!(ADC1->ISR & ADC_ISR_EOSMP_Msk)) {} // 等待采样完成
int val = ADC1->DR & ADC_DR_DATA_Msk; // 获取采样值
char buf[16];
sprintf(buf, "%d\r\n", val);
for (int i = 0; i < strlen(buf); i++) {
USART2_sendChar(buf[i]); // 输出采样值
}
}
}
```
阅读全文