本帖最后由 Krvice 于 2021-2-20 20:55 编辑
用了很多方法检测但还是不能解决问题
采用的
单片机是
STM32F103C8T6,串口芯片CH340C
想通过CH340串口实现
通信和ISP下载,但是测试中发现ISP下载串口无应答,并且串口通信程序通过SW烧写进去之后电脑也无法接收到数据,库函数编写的程序和CubeMX生成的程序都不行,同样的程序在最小系统板上都能够实现相应的功能。
把CH340C的TXD、RXD引脚飞线连接,再用电脑发送数据,这个时候是可以电脑是可以接收到数据的。
单片机如果烧写一下点灯程序,中断服务程序都是可以运行的,但是一到串口部分就会无应答
利用了LED灯检测串口程序运行状态显示,串口初始化部分可以正常执行,但是到了数据发送函数部分貌似就不能执行了。(在串口程序的每个部分后面加一个比较长的延时,延时后写一个点灯的小程序,点灯之后再加一个延时,保证LED变化可以比较容易的观察到)
原理图和串口程序如下
#include "bsp_usart.h"
static void NVIC_Configuration(
void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void USART_Config(
void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);
// USART Tx的GPIO配置
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);
// USART Rx的GPIO配置
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
// 配置串口参数
USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(DEBUG_USARTx, &USART_InitStructure);
NVIC_Configuration();
USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);
USART_Cmd(DEBUG_USARTx, ENABLE);
}
void Usart_SendByte(USART_TypeDef* USARTx, uint8_t data)
{
USART_SendData(USARTx, data);
while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
}