首页 > 其他分享 >STM32深入学习3:DMA,串口通信和看门狗

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

时间:2023-08-25 20:00:36浏览次数:47  
标签:DMA IWDG USART void 看门狗 NVIC InitStructure 串口 GPIO

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);
}	

标签:DMA,IWDG,USART,void,看门狗,NVIC,InitStructure,串口,GPIO
From: https://www.cnblogs.com/ustc2122zy/p/17652740.html

相关文章

  • ATtiny88初体验(四):看门狗
    ATtiny88初体验(四):看门狗ATtiny88单片机的看门狗使用内部独立的128KHz时钟源,拥有3种工作模式:Interrupt模式:超时产生中断;SystemReset模式:超时产生系统复位;Interrupt&SystemReset模式:超时产生中断,中断处理完成后产生系统复位。当熔丝位WDTON被编程时(值为0),将强制将看门......
  • PDManger c# sqlserver数据库代码
    usingSystem;usingSystem.Collections.Generic;usingSqlSugar;$blankline{{vartoday=newDate();varfullYear=today.getFullYear();varmonth=today.getMonth()+1;vardays=today.getDate();varsqlSugartable='[SugarTable("......
  • STM23学习记录2:外部中断,串口通信,定时器
    外部中断:向量表:异常+中断所有端口的PIN0对应着EXTI0中短线,PIN1对应EXTI1中断线,依次类推16个外部中断线,对应7个外部中断入口地址配置中断优先级的4位要同时完成抢占优先级和响应优先级(子优先级或副优先级)的配置:两组优先级2+2,2^2抢占,2^2响应比较常用使用NVIC_PriorityGroupCon......
  • 字符串口胡记录
    [NOIP2020]字符串匹配枚举两个分界点并检查是否合法的暴力很显然,考虑优化。字符串只会哈希可以想到用哈希优化比较复杂度,具体来说,只用枚举\(AB\)的长度\(len\),然后每次暴力往后跳用哈希检查往下\(len\)个字符并更新答案,直到它们与\(AB\)不同。同时考虑如何统计\(f(A)\leqf(C......
  • 串口助手
    https://github.com/cry1109/NbCommhttps://www.vofa.plus/docs/learning/start/quick_startJscope你买盗版jlink用hss模式也能干到1khz,串口压根达不到这个速度。......
  • RDMA远程直接内存访问
    RDMA(RemoteDirectMemoryAccess)技术全称远程直接内存访问,就是为了解决网络传输中服务器端数据处理的延迟而产生的。它将数据直接从一台计算机的内存传输到另一台计算机,无需双方操作系统的介入。这允许高吞吐、低延迟的网络通信,尤其适合在大规模并行计算机集群中使用。RDMA通过网......
  • 《串口篇》实现模拟串口通信(未验证)
    实现串口通信参考链接:https://www.jb51.net/article/279177.htm新建项目出于简单考虑,首先创建一个Winform项目,本文项目名称为portTest。串口通信,至少有两个串口才能通信,所以拖动两个GroupBox,一左一右,里面分别放置一个Combobox、一个按钮,以及两个TextBox用于发送和接收内容,第二......
  • 《串口篇》实现串口通信
    实现串口通信参考链接:jb51.net/article/237854.htm本文实例为大家分享了C#实现串口通信的具体代码,供大家参考,具体内容如下基本概念前端效果使用winform代码实现如下点击查看代码namespaceSerialPortTest {   publicpartialclassForm1:Form   {......
  • Android串口调试 libserial_port.so: has text relocations
    遇到问题:Android串口调试libserial_port.so:hastextrelocations解决方法1在Android.mk文件中加入:LOCAL_LDFLAGS+=-fPIC,重新编译Google开源库的源码,生成.so库LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)TARGET_PLATFORM:=android-3......
  • 在CentOS小实验看门狗watchdog
    前言继续上文内容https://blog.51cto.com/infrado/7083074,上文说到,看门狗的调用。环境实验环境同上文,继续是ESXi环境,进行一些有趣的实验,以及在x86服务器硬件上,看门狗是如何工作的,以及arm环境的Linux系统看门狗的小实验。watchdog经常被用于重置系统,其实在很多业务中相当实用,但是极......