STM32深入学习3:DMA,串口通信和看门狗

发布时间 2023-08-25 19:56:43作者: zxkic

DMA

DMA直接存储器存取,用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。
DMA1有7个通道,DMA2有5个通道,还有一个仲裁器来协调各个DMA请求的优先权。
DMA的作用是实现数据的直接传输,从地址到地址的数据传输。
DMA传输的相关参数:源地址,目标地址,数据传输量,传输模式

主要特征

FLASH,SRAM,外设的SRAM,APB1,APB2,AHB外设都可以作为DMA的源和目的。
DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程

UART

串口通信:通过3个引脚与其他设备连接在一起,USART双向通信需要两个脚,接收数据输入(RX)和发送数据输出(TX) 。
采样率、校验位,数据位和停止位必须保持一致
USART_BRR和USART中断控制
USART还需要处理NVIC的配置,因此需要进行中断处理。

void Serial_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate = 9600;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_Init(USART1, &USART_InitStructure);
	
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);
	
	USART_Cmd(USART1, ENABLE);
}

UART的中断处理函数

void USART1_IRQHandler(void)
{
	if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
	{
		Serial_RxData = USART_ReceiveData(USART1);
		Serial_RxFlag = 1;
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);
	}
}

DMA有点难懂,DMA和串口一起通信处理的部分我之后搞懂了再补充

看门狗

定位器复位电路,看门狗电路。
独立看门狗,窗口看门狗

功能总结:在键寄存器(IWDG_KR)中写入0XCCCC,开始启动独立看门狗;此时计数器开始从其复位值0XFFF递减计数。当计数器计数到末尾0X000时,会产生一个复位信号(IWDG_RESET)。只要在键寄存器中写入0XAAAA,IWDG_RLR中的值就会被重新加载到计数器中,从而避免看门狗复位。
循环操作之后需要喂狗。
相关固件库:
void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);
void IWDG_SetReload(uint16_t Reload);
void IWDG_ReloadCounter(void);
void IWDG_Enable(void);

初始化代码:

void IWDG_Init(){
	RCC_LSICmd(ENABLE);
	while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY)==RESET);
	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
	IWDG_SetPrescaler(IWDG_Prescaler_32);
	IWDG_SetReload(1250-1);
	IWDG_ReloadCounter();
	IWDG_Enable();
}

窗口看门狗(wwdg)

产生复位的两种情况:
1.

2.

初始化代码:

void wwdg_init(){
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
	WWDG_SetPrescaler(WWDG_Prescaler_8);
	WWDG_SetWindowValue(80);
	WWDG_Enable(127);
}