一、GPIO端口
1.1 开启所需IO口时钟
1.2 配置GPIO工作模式
GPIO端口模式寄存器 (GPIOx_MODER):
00:输入
01:通用输出模式
10:复用功能模式
11:模拟模式
GPIO端口输出类型寄存器 (GPIOx_OTYPER):
0:推挽输出
1:输出开漏
GPIO端口输出速度寄存器 (GPIOx_OSPEEDR):
00:2 MHz(低速)
01:25 MHz(中速)
10:50 MHz(快速)
11:30 pF 时为 100 MHz(高速)
GPIO 端口输出数据寄存器 (GPIOx_ODR): 写1置1,写0清零
GPIO 端口置位/复位寄存器 (GPIOx_BSRR): 分为GPIOx_BSRRH和GPIOx_BSRRL,GPIOx_BSRRH写1给对应端口位清零,GPIOx_BSRRL写1给对应端口置1。
GPIO 复用功能低位寄存器 (GPIOx_AFRL):端口 x 位 y 的复用功能选择,(y:0——7)
GPIO 复用功能低位寄存器 (GPIOx_AFRL):端口 x 位 y 的复用功能选择,(y:8——15)
1.3 初始状态设置
void LED_Init(void)
{
RCC->AHB1ENR |= 1<<5; //开启F口时钟
/***********PF6************/
GPIOF->MODER &= ~(3<<2*6); //清零
GPIOF->MODER |= 1<<2*6; //通用输出
GPIOF->OTYPER &= ~(1<<6); //推挽输出
GPIOF->OSPEEDR &= ~(3<<2*6); //清零
GPIOF->OSPEEDR |= 2<<2*6; //输出速度50MHz
GPIOF->ODR |= 1<<6; //初始状态为高电平
}
二、基本定时器
1.控制寄存器 1 (TIMx_CR1)
2.控制寄存器 2 (TIMx_CR2)
3.DMA/中断使能寄存器 (TIMx_DIER)
4.状态寄存器 (TIMx_SR):标志位(每次更新事件后要置零)
5.事件生成寄存器 (TIMx_EGR):手动更新
6.计数器 (TIMx_CNT):存储计数值
7.预分频器 (TIMx_PSC)
8.自动重载寄存器 (TIMx_ARR):存放自动重装载值(当计数器达到此值时,计数器发生跟新时间,并重新开始计数)
/***********************
函数功能:TIM7基本定时器初始化
***********************/
void TIM_Init_7(void)
{
RCC->APB1ENR |= 1<<5; //开启TIM7时钟
TIM7->CR1 |= 1<<7; //开启自动重装载寄存器的影子寄存器
TIM7->CR1 &= ~(1<<3); //循环计数
TIM7->CR1 &= ~(1<<2); //更新请求源
TIM7->CR1 &= ~(1<<1); //使能更新
TIM7->CR1 &= ~(1<<0); //关闭计数器
}
/************TIM7us延时函数**************/
void TIM7_us(u16 us)
{
TIM7->CNT = 0; //计数器清零
TIM7->PSC = 84-1; //预分频系数
TIM7->ARR = us; //重装载值 ---- 最大计数周期
TIM7->EGR |= 1<<0; //手动更新 UG位置1
TIM7->SR &= ~(1<<0); //清除标志位
TIM7->CR1 |= (1<<0); //开启计数器
while(!(TIM7->SR & 1<<0));
TIM7->SR &= ~(1<<0); //清除标志位
TIM7->CR1 &= ~(1<<0); //关闭计数器
}
三、串口 USART
3.1 串口发送数据
1)、在MCU内定义需要发送的数据
2)、MCU将需要发送的数据通过数据总线写入到“发送数据寄存器”
/*********************以下步骤由硬件自动完成**********************/
3)、当“发送数据寄存器”被写入后,将数据并行发送到“发送移位寄存器”,并且由硬件自动产生一个“发送数据寄存器”为空的标志。
4)、“发送移位寄存器”伴随着已经设置好的波特率时钟脉冲,把数据按照顺序一位一位的发送到数据发送管脚(TX),当“发送移位寄存器”为空并且“发送数据寄存器”也为空的时候,由硬件自动产生一个“传输完成”的标志。
5)、数据在串口发送管脚发送数据,数据通过USB转串口芯片(电平转换芯片)后,由USB数据线传输到电脑上位机上。
3.2 串口接收数据
1)、电脑上位机通过USB线发送数据,数据通过USB转串口芯片发送到串口接收数据管脚(RX)
2)、接收管脚根据已经设置好的波特率时钟脉冲,一位一位的把数据传输到“接收移位寄存器”中
3)、当“接收移位寄存器”接收完数据之后,并行把数据传输到“接收数据寄存器”中,并且会由硬件自动产生一个“接收数据寄存器”为满的标志。
/*******************以上步骤由硬件自动完成********************/
4)、CPU通过数据总线读出“接收数据寄存器”的内容。
常用寄存器:
状态寄存器 (USART_SR)
数据寄存器 (USART_DR)
波特率寄存器 (USART_BRR)
控制寄存器 1 (USART_CR1)
控制寄存器 2 (USART_CR2)
控制寄存器 3 (USART_CR3)
/******************************************
函数功能:串口初始化函数
函数参数:bount:波特率
函数返回值:无
硬件接口:
PA9---USART1_TX-----输出
PA10--USART1_RX-----输入
******************************************/
void Usart1_Tnit(u32 bount)
{
float USARTDIV;
u32 USART_ZHENG,USART_XIAO;
//GPIO初始化
RCC->AHB1ENR |= 1<<0; //开启A口时钟
GPIOA->MODER &= ~(3<<2*9); //PA9清零
GPIOA->MODER |= 2<<2*9; //设置PA9为复用模式
GPIOA->MODER &= ~(3<<2*10); //PA10清零
GPIOA->MODER |= 2<<2*10; //设置PA10为复用模式
GPIOA->AFR[1] |= 7<<4*(9-8); //PA9的复用功能为USART1
GPIOA->AFR[1] |= 7<<4*(10-8); //PA10的复用功能为USART1
//USART1初始化
RCC->APB2ENR |= 1<<4; //开启USART1时钟
USART1->CR1 &= ~(1<<15); //16倍过采样模式
USART1->CR1 &= ~(1<<12); //数据位长度为8位
USART1->CR2 &= ~(3<<12); //1个停止位
//波特率
USARTDIV = 84000000.0/(8*(2-0)*bount);
USART_ZHENG = USARTDIV;
USART_XIAO = (USARTDIV - USART_ZHENG)*16;
USART1->BRR = USART_ZHENG<<4 | USART_XIAO;
USART1->CR1 |= 1<<3; //发送器使能
USART1->CR1 |= 1<<2; //接收器使能
USART1->CR1 |= 1<<13; //使能USART1
}