历史上的今天
今天是:2024年10月20日(星期日)
2018年10月20日 | STM32F429 串口通信_初始化
2018-10-20 来源:eefocus
一、相关原理:
1. 初始化HAL库;
2. 初始化stm32系统时钟,设置时钟,包括PLL时钟、以及外设时钟APB1,APB2.......
3. 初始化时延系统;
4. 初始化串口,包括串口、串口使用的GPIO口、使能串口本身的中断、使能串口在NVIC上对应的中断;
二、 代码实现:
1. 初始化HAL库
HAL_StatusTypeDef HAL_Init()
{
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);
HAL_InitTick(TICK_INT_PRIORITY);
HAL_MspInit();
}
2. 时钟初始化
Stm32_Clock_Init(360,25,2,8);
void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq)
{
HAL_StatusTypeDef ret = HAL_OK;
RCC_OscInitTypeDef RCC_OscInitStructure;
RCC_ClkInitTypeDef RCC_ClkInitStructure;
__HAL_RCC_PWR_CLK_ENABLE() //使能PWR时钟????
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStructure.OscillatorType=RCC_OSCILLATORTYPE_HSE; //时钟源为HSE
RCC_OscInitStructure.HSEState=RCC_HSE_ON; //打开HSE
RCC_OscInitStructure.PLL.PLLState=RCC_PLL_ON;//打开PLL
RCC_OscInitStructure.PLL.PLLSource=RCC_PLLSOURCE_HSE;//PLL时钟源选择HSE
RCC_OscInitStructure.PLL.PLLM=pllm; //主PLL和音频PLL分频系数(PLL之前的分频),取值范围:2~63.
RCC_OscInitStructure.PLL.PLLN=plln; //主PLL倍频系数(PLL倍频),取值范围:64~432.
RCC_OscInitStructure.PLL.PLLP=pllp; //系统时钟的主PLL分频系数(PLL之后的分频),取值范围:2,4,6,8.(仅限这4个值!)
RCC_OscInitStructure.PLL.PLLQ=pllq; //USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频),取值范围:2~15.
ret=HAL_RCC_OscConfig(&RCC_OscInitStructure);//初始化
if(ret!=HAL_OK) while(1);
//选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2
RCC_ClkInitStructure.ClockType=(RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2);
RCC_ClkInitStructure.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;//设置系统时钟时钟源为PLL
RCC_ClkInitStructure.AHBCLKDivider=RCC_SYSCLK_DIV1;//AHB分频系数为1
RCC_ClkInitStructure.APB1CLKDivider=RCC_HCLK_DIV4; //APB1分频系数为4
RCC_ClkInitStructure.APB2CLKDivider=RCC_HCLK_DIV2; //APB2分频系数为2
ret=HAL_RCC_ClockConfig(&RCC_ClkInitStructure,FLASH_LATENCY_5);//同时设置FLASH延时周期为5WS,也就是6个CPU周期。
if(ret!=HAL_OK) while(1);
}
3. 初始化时延系统;
delay_init(180);
void delay_init(u8 SYSCLK)
{
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);//SysTick频率为HCLK
fac_us=SYSCLK; //不论是否使用OS,fac_us都需要使用
}
4. 串口初始化
uart_init(115200);
//初始化IO 串口1
//bound:波特率
void uart_init(u32 bound)
{
//UART 初始化设置
UART1_Handler.Instance=USART1; //USART1
UART1_Handler.Init.BaudRate=bound; //波特率
UART1_Handler.Init.WordLength=UART_WORDLENGTH_8B; //字长为8位数据格式
UART1_Handler.Init.StopBits=UART_STOPBITS_1; //一个停止位
UART1_Handler.Init.Parity=UART_PARITY_NONE; //无奇偶校验位
UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE; //无硬件流控
UART1_Handler.Init.Mode=UART_MODE_TX_RX; //收发模式
HAL_UART_Init(&UART1_Handler); //HAL_UART_Init()会使能UART1
HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量
}
void HAL_UART_Init(UART1)
{
HAL_UART_MspInit(UART1);
}
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
//GPIO端口设置
GPIO_InitTypeDef GPIO_Initure;
if(huart->Instance==USART1)//如果是串口1,进行串口1 MSP初始化
{
__HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟
__HAL_RCC_USART1_CLK_ENABLE(); //使能USART1时钟
GPIO_Initure.Pin=GPIO_PIN_9; //PA9
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FAST; //高速
GPIO_Initure.Alternate=GPIO_AF7_USART1; //复用为USART1
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA9
GPIO_Initure.Pin=GPIO_PIN_10; //PA10
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA10
HAL_NVIC_EnableIRQ(USART1_IRQn); //使能USART1中断通道
HAL_NVIC_SetPriority(USART1_IRQn,3,3); //抢占优先级3,子优先级3
#endif
}
}
史海拾趣
|
PADS 9.0版产品的出现标志着下一代PADS流程技术的诞生。与以往的旧产品相比, PADS 9.0修复和改善了之前版本软件的不足和缺点,集成了许多全新的功能,拥有了更高的可扩展性和集成度,从而使设计者能够结合Mentor Graphics众多独特的创新技术,实现 ...… 查看全部问答> |
|
DIY FPGA初级学习板,核心板已画好,欢迎大家继续提意见! 【背景贴】: “taikai001”俺想学习FPGA--有偿寻求合作开发FPGA学习板https://bbs.eeworld.com.cn/thread-93001-1-1.html 经过和taikai001的几次讨论,准备还是搞个简单点,适合入门的。 目前基本的功能我已经画好了,随后会把原理图发上来 ...… 查看全部问答> |
|
基于WINCE 5.0操作平台,在VC2005 开发MFC智能设备应用软件 在VS2005开发平台下,开发的软件直接通过Microsoft ActiveSync 同步软件下载到2440开发扳上可以运行(通过开发环境) ;单独生成Release版本的,脱离开发环境下载到开发板上就不能运行了. 而使用eVC开发的应用程序就不存在这个问题. &nbs ...… 查看全部问答> |
|
一、移植过程1、架构移植2、SOC移植3、板级移植二、3种移植的区别 1、架构移植:Cortex-A8、MIPS、POWERPC 2、SOC移植 :同一系列,不同型号间的外设(如I2C)的区别 &nbs ...… 查看全部问答> |
|
昨天成功地完成了BBB的上网问题,但是今天发现似乎有更方便的解决方案。 之前配置两张网卡是直接在/etc/network/interfaces中写入配置信息的。这样做当然可以成功,但是有一个问题,就是系统托盘上的NetworkManager就不会再出现和这两张网卡相关的 ...… 查看全部问答> |




