gd32f103单片机两个串口初始化
时间: 2023-10-13 22:03:12 浏览: 80
要初始化gd32f103单片机的两个串口,首先需要打开串口时钟。通常情况下,USART1的时钟默认是开启的,如果需要使用USART2,需要手动开启其时钟。
步骤如下:
1. 首先,在库文件中找到对应的寄存器地址。USART1的寄存器地址是0x40013800,USART2的寄存器地址是0x40004400。
2. 对串口1进行初始化:将USART1的时钟使能位USART1EN设置为1,即RCC_APB2ENR寄存器中对应位设置为1。然后设置寄存器USART1_CR1的UE位为1,使能USART1。
3. 对串口2进行初始化:同样设置USART2的时钟使能位USART2EN为1,即RCC_APB1ENR寄存器中对应位设置为1。然后设置寄存器USART2_CR1的UE位为1,使能USART2。
4. 接下来,需要设置串口的波特率、数据位数、停止位、校验位等参数。这些参数需要根据具体需求进行配置。
5. 最后,需要设置串口的工作模式。可以选择同步模式或异步模式,以及各种中断模式。
需要注意的是,在配置完以上参数后,还需要设置GPIO相应的引脚为串口的功能引脚,以及配置引脚的工作模式(推挽输出或开漏输出),也可以选择是否配置硬件流控等功能。
以上是大致的初始化步骤,具体的代码实现与工具选择会根据不同的开发环境和库文件而有所变化。在具体开发中,可以参考相关的手册和例程来完成串口的初始化操作。
相关问题
gd32f103 定时器初始化
gd32f103系列微控制器具有多个定时器,其中最常用的是通用定时器(General Purpose Timer,简称GPT)和基本定时器(Basic Timer)。
定时器的初始化一般包括以下步骤:
1. 配置定时器的时钟源和工作模式。使用RCC和相关寄存器来设置定时器的时钟源,可以选择内部时钟或外部时钟,并设置相关分频因子,使得定时器的时钟频率满足需求。
2. 配置定时器的计数模式。定时器可以根据需求选择不同的计数模式,如向上计数模式、向下计数模式、中央对齐模式等。
3. 配置定时器的自动重装载值(ARR,Auto-Reload Register)和预分频值(PSC,Prescaler Register)。自动重装载值决定定时器计数溢出时的重装载值,预分频值决定定时器计数频率的分频比例。
4. 配置定时器的输出PWM功能(若需要)。使用相关寄存器配置定时器的PWM输出模式、占空比和输出通道。
5. 启动定时器。设置控制寄存器来启动定时器的计数。
下面以GPT1定时器为例,展示初始化的代码:
// 使能GPT1的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPT1, ENABLE);
// 设置GPT1时钟源为内部时钟
GPT1->CH1PSC = 0;
// 设置GPT1计数模式为向上计数
GPT1->CH1CTLbits.MOD = 0b00;
// 设置GPT1的自动重装载值和预分频值
GPT1->CH1ARR = 10000; // 设置自动重装载值为10000
GPT1->CH1PSC = 7200; // 设置预分频值为7200
// 配置GPT1的PWM输出
GPT1->CH1CTLbits.OCM = 0b110; // 设置为PWM模式
GPT1->CH1CAR = 5000; // 设置占空比为50%
GPT1->CH1CC = 5000; // 设置输出通道1的比较值
// 启动GPT1计数
GPT1->CH1CTLSETbits.EN = 1;
以上代码演示了如何初始化并启动GPT1定时器,其中包括了时钟配置、计数模式设置、自动重装载值和预分频值设置、PWM输出配置,最后使用控制寄存器启动计数。具体的配置值根据需求而定,以上仅供参考。
GD32F103初始化
可以使用标准的STM32 HAL库进行GD32F103的初始化,具体步骤如下:
1. 配置系统时钟,包括外部晶振、PLL倍频等参数。
2. 配置GPIO口,包括输入输出模式、上下拉电阻等参数。
3. 配置定时器、串口、SPI等外设,包括时钟源、波特率、数据格式等参数。
4. 启动外设,开始工作。
以下是一个简单的GD32F103初始化代码示例:
#include "stm32f1xx_hal.h"
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
while (1)
{
// main loop
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}
static void MX_USART1_UART_Init(void)
{
USART_InitTypeDef USART_InitStruct;
__HAL_RCC_USART1_CLK_ENABLE();
USART_InitStruct.BaudRate = 115200;
USART_InitStruct.WordLength = USART_WORDLENGTH_8B;
USART_InitStruct.StopBits = USART_STOPBITS_1;
USART_InitStruct.Parity = USART_PARITY_NONE;
USART_InitStruct.Mode = USART_MODE_TX_RX;
USART_InitStruct.CLKPolarity = USART_POLARITY_LOW;
USART_InitStruct.CLKPhase = USART_PHASE_1EDGE;
USART_InitStruct.CLKLastBit = USART_LASTBIT_DISABLE;
if (HAL_USART_Init(&huart1, &USART_InitStruct) != HAL_OK)
{
Error_Handler();
}
}