多片片STM32F103单片机串口共用的具体代码
时间: 2024-10-28 11:12:46 浏览: 18
在STM32F103系列单片机中,如果需要两个串口共用一块GPIO资源,通常的做法是通过软件模拟串口复用。这里假设我们有两个USART(通用异步收发器),例如USART1和USART2,它们共享部分GPIO引脚作为TX(发送)和RX(接收)。以下是使用FreeRTOS操作系统的一个简化示例,展示了如何配置和使用这两个串口:
```c
// 宏定义GPIO初始化
#define USART1_TX_PIN GPIO_Pin_9
#define USART1_RX_PIN GPIO_Pin_10
#define USART1_GPIO_PORT GPIOA
#define USART2_TX_PIN GPIO_Pin_3
#define USART2_RX_PIN GPIO_Pin_4
#define USART2_GPIO_PORT GPIOB
void USART1_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
// 初始化USART1 TX/RX GPIO
GPIO_InitStructure.GPIO_Pin = USART1_TX_PIN | USART1_RX_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_Init(USART1_GPIO_PORT, &GPIO_InitStructure);
// 接続到USART1的EXTI中断
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line_10; // 对应于RX PIN
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Rising; //上升沿触发
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿唤醒线程
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
// USART1配置
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 9600;
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(USART1, &USART_InitStructure);
}
void USART2_Init(void) {
// ... (类似上面的代码,只是替换对应的端口引脚)
}
// 然后,在任务函数中,你可以选择当前正在使用的串口进行操作,如:
void handle_USART1(void *arg) {
while (1) {
// 对USART1的处理...
}
}
void handle_USART2(void *arg) {
while (1) {
// 对USART2的处理...
}
}
```
记得在创建任务时分配不同的任务指针给每个串口相关的任务,比如`xTaskCreate(handle_USART1, "USART1 Task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL)` 和 `xTaskCreate(handle_USART2, "USART2 Task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL)`。
阅读全文