CH3-usart

USART概念

硬件连接原理

CH443K

CH443K是SPDT低阻宽带双向模拟开关芯片。CH443K包含1通道SPDT单刀双掷模拟开关,高带宽,低导通电阻,可以用于视频或者USB信号二选一切换。

image-20240324185632234
芯片原理图
image-20240324185738283
芯片引脚说明
image-20240324185508648
内部逻辑电路

CH443K内部的单通道单刀双掷模拟开关SPDT,由SEL 引脚选择进行切换。下表是其控制真值表。

image-20240324185853001
芯片控制真值表

开发板原理图分析

由开发板可以看到下载区的电路通过两个CH443K芯片连接A/B两区,当选的A区进行通信时,引脚连接到A区的PA2和PA3,于是我们需要配置该USART通信口

image-20240324184209087

开发板原理图

CubeMX配置

image-20240324183515909
下载线配置
image-20240324183431373
时钟树配置
image-20240324141736021
USART配置
image-20240324182926174
DMA配置
image-20240324183200293
DMA与USART的NVIC配置
image-20240324183343088
NVIC配置

KEIL代码编写

注:

1.如果需要定义一个变量能在多个文件中使用,我们需要在源文件.中进行定义(可以赋值),在需要调用的文件中使用extern进行声明(禁止赋值)

2.==只有直接通过数组名作为sizeof参数时,输出才是数组长度。如果通过 指针 或者 数组 作为函数参数时候,数组名会变成一个指针变量,输出长度为4==

1
2
3
假设: uint8 a[20],uint8 * p = &a;
sizeof(a) or sizeof(&a) ,输出结果为20
sizeof(p) or sizeof(*p) ,输出结果为4

如何通过指向数组的指针求数组长度,应该是不能的,所以定义数组前一般要定义长度len

function.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "function.h"

unsigned int flag_send=0;//定义了一个发送信息的flag,如果等于1那么就发送一次数据==USER按键被按下

void send_mess(const uint8_t *mess,const unsigned int send_messlen)//传输数据函数,第一个参数为要传输的数据,第二个参数为数据的长度
{
extern UART_HandleTypeDef huart2;//这里需要声明一下huart2结构体,否则程序找不到
HAL_UART_Transmit_DMA(&huart2,mess,send_messlen); //使用DMA通信,第一个参数是哪一个通信的结构体, 第二个参数是要传输的数据, 第三个参数为数据的长度
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//中断的回调函数
{

if(USER_KEY_Pin == GPIO_Pin)//如果按键按下那么就将发送标志位置1
flag_send=1;
}

main.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "function.h"
extern unsigned int flag_send;//声明使用的外部定义变量
unsigned char send_dma[]="\r\npress ok!!!\r\n";//所需要发送的数据
int main(void)
{
while (1)
{
if(1==flag_send)//按键按下那么就发送数据
{
flag_send=0;//发送标志位清零,否则会一直发送数据
send_mess(send_dma,sizeof(send_dma));
}
}
}