GD 和STM32 芯片在串口发送代码的处理的区别。

__align(8) u8 USART3_TX_BUF[USART3_TXBUFF_SIZE]; //串口2发送区

void u3_printf(char* fmt,…)
{
u16 i,length;
volatile u16 tmp;

va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART3_TX_BUF,fmt,ap);
va_end(ap);
	
length=strlen((const char*)USART3_TX_BUF);	
//lejianz 20210106
//while((USART3->SR&0X40)==0);

//lejianz 20211004
//while((USART3->SR&0X40)==0); 这条指令在GD的芯片是需要禁止的,但在STM32芯片需要打开,否则STM32芯片时,8266是通不过的,复位失败。
//因此,改写了下面的指令,主要是读一次SR寄存器,这样就清除了TC的标志位,同时定义TMP为volatile变量。防止指令优化。

tmp = USART3->SR;
for(i = 0;i < length;i ++)
{			
	USART3->DR = USART3_TX_BUF[i];
	while((USART3->SR&0X40)==0);	
	
}	
tmp = tmp;

}

不同 STM32 系列芯片串口发送数据代码编写上存在多方面差异。 ### 硬件资源差异 不同系列芯片串口数量引脚分配不同。例如,STM32F10xxx 系列有 5 个异步串口,而 GD32F10x 只有 3 个异步串口,且 STM32F10xxx 系列芯片 GD32F10x 系列芯片串口 1 接口引脚的分配编号不一样[^1]。这意味着在初始化 GPIO 引脚时,代码需要根据具体芯片系列的引脚定义进行配置。以下是 STM32F103 系列 USART1 引脚初始化示例: ```c GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // USART1 Tx (PA.9) GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // USART1 Rx (PA.10) GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); ``` 如果是其他系列芯片,引脚可能不同,代码需要相应修改。 ### 时钟配置差异 不同系列芯片的时钟树结构不同,在使能串口 GPIO 时钟时,代码会有差异。例如,STM32F1 系列使用 `RCC_APB2PeriphClockCmd` 使能 USART1 时钟: ```c RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); ``` 而其他系列芯片可能有不同的时钟使能函数时钟源选择。 ### 寄存器地址名称差异 不同系列芯片的寄存器地址名称可能不同。虽然标准库函数在一定程度上屏蔽了这些差异,但在使用寄存器操作时,需要根据具体芯片系列进行调整。例如,在直接操作 USART 数据寄存器时,不同系列芯片的寄存器地址可能不同。 ### 标准库或 HAL 库差异 不同系列芯片可能使用不同版本的标准库或 HAL 库。例如,STM32F1 系列常用标准库,而 STM32F4、STM32F7 等系列更多使用 HAL 库。使用 HAL 库时,代码风格函数调用方式与标准库有较大差异。以下是 HAL 库初始化 USART1 的示例: ```c UART_HandleTypeDef huart1; void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 9600; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值