国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32入門筆記10_USART串口通信+案例:上位機控制LED亮滅(USART串口通信、TIM定時器、EXTI綜合案例)

這篇具有很好參考價值的文章主要介紹了STM32入門筆記10_USART串口通信+案例:上位機控制LED亮滅(USART串口通信、TIM定時器、EXTI綜合案例)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

USART串口通信

通信接口

  • 通信的目的: 將一個設備的數據傳送到另一個設備, 擴展硬件系統(tǒng)
  • 通信協議: 制定通信的規(guī)則, 通信雙方按照協議規(guī)則進行數據收發(fā)
名稱 引腳 雙工 時鐘 電平 設備
USART TX、RX 全雙工 異步 單端 點對點
I2C SCL、SDA 半雙工 同步 單端 多設備
SPI SCLK、MOSI、MISO、CS 全雙工 同步 單端 多設備
CAN CAN_H、CAN_L 半雙工 異步 差分 多設備
USB DP、DM 半雙工 異步 差分 點對點

USART有同步和異步兩種通訊方式, 但同步只用作特殊功能, 一般只使用異步通訊

串口通信

  • 串口是一種應用十分廣泛的通訊接口, 串口成本低, 容易使用、通信線路簡單, 可實現兩個設備的互相通信
  • 單片機的串口可以使單片機與單片機、單片機與電腦、單片機與各式各樣的模塊互相通信, 極大地擴展了單片機的應用范圍, 增強了單片機系統(tǒng)的硬件實力

通信方式

串行通信與并行通信

  • 串行通信: 數據字節(jié)一位位地依次傳送的通信方式, 串行通信的速度慢, 但用的傳輸線條數少, 成本低,適用于遠距離的數據傳送
  • 并行通信: 數據字節(jié)的各位同事傳送的通信方式, 優(yōu)點是數據傳送速度快, 缺點是占用的傳輸線條數多, 適用于近距離通信, 遠距離通信的成本較高

串行異步通信和串行同步通信

異步通信:

一次通信傳送一個字符幀, 發(fā)送的字符之間的時間間隔可以是任意的, 優(yōu)點是通信設備簡單、價格低廉, 但因為具有起始位和停止位, 傳輸效率較低

同步通信:

進行通信前先建立同步, 發(fā)送頻率和接受方的接受頻率要同步。在發(fā)送信息時, 將多個字符加上同步字符組成一個信息幀, 有一個統(tǒng)一的時鐘控制發(fā)送端的發(fā)送, 接收端識別到同步字符后, 就認為開始一個信息幀, 此后位數作為實際傳輸信息處理。優(yōu)點: 傳輸速度較快, 可用于點對多點 缺點: 需要使用專用的時鐘控制線實現同步, 對于長距離通信成本較高, 通信速率也會降低。一般用于同一PCB上芯片級之間的通信

串口參數及時序(串行異步通信)

  • 波特率: 串口通信的速率
  • 起始位: 標志一個數據幀的開始, 固定為低電平
  • 數據位: 數據幀的有效載荷, 1為高電平, 0為低電平, 低位先行
  • 校驗位: 用于數據驗證, 根據數據位計算得來
  • 停止位: 用于數據幀間隔, 固定為高電平

上位機控制stm32,單片機學習筆記,stm32,單片機,嵌入式硬件,c語言

硬件電路

  • 簡單雙向串口通信有兩根通信線(發(fā)送端TX和接受端RX)
  • TX與RX需要交叉連接
  • 當只需單向的數據傳輸時, 可以只接一根通信線
  • 當電平標準不一致時, 需要加電平轉換芯片

上位機控制stm32,單片機學習筆記,stm32,單片機,嵌入式硬件,c語言

電平標準

  • 電平標準是數據1和數據0的表達方式, 是傳輸線纜中人為規(guī)定的電壓與數據的對應關系, 串口常用的電平標準有如下三種:
  • TTL電平: +3.3V或+5V表示1, 0V 表示0
  • RS232電平: -3~-15V表示1, +3~+15V表示0
  • RS485電平: 兩線壓差+2~+6V表示1, -2~-6V表示0(差分信號)

差分信號的干擾小, 一般TTL電平和RS232電平傳輸距離只有十幾米, 而RS485電平的傳輸范圍可達數千米

串口時序

上位機控制stm32,單片機學習筆記,stm32,單片機,嵌入式硬件,c語言

USART簡介

  • USART(Universal Synchronous/Asynchronous Receiver/Transmitter) 通用同步/異步收發(fā)器
  • USART是STM32內部集成的硬件外設, 可根據數據寄存器的一個字節(jié)數據自動生成數據幀時序, 從TX引腳發(fā)送出去, 也可自動接收RX引腳的數據幀時序, 拼接為一個字節(jié)數據, 存放在數據寄存器里
  • 自帶波特率發(fā)生器, 最高可達4.5Mbits/s
  • 可配置數據位長度(8/9)、停止位長度(0.5/1/1.5/2)
  • 可選校驗位(無校驗/奇校驗/偶校驗)
  • 支持同步模式、硬件流控制、DMA、智能卡、IrDA、Lin
  • STM32F108C8T6 USART資源: USART1、USART2、USART3

USART框圖

上位機控制stm32,單片機學習筆記,stm32,單片機,嵌入式硬件,c語言

USART基本結構

上位機控制stm32,單片機學習筆記,stm32,單片機,嵌入式硬件,c語言

數據幀

上位機控制stm32,單片機學習筆記,stm32,單片機,嵌入式硬件,c語言

  • 字長包含校驗位 一般情況下: 9位字長(設置奇偶校驗) 8位字長(無校驗)
    上位機控制stm32,單片機學習筆記,stm32,單片機,嵌入式硬件,c語言

起始位偵測

上位機控制stm32,單片機學習筆記,stm32,單片機,嵌入式硬件,c語言

  • 在一位的時間里進行16次的采樣
  • 3、5、7/ 8、9、10次進行采樣 且要求每3位至少應該有兩個0(只有兩個0會在狀態(tài)寄存器里置NE, 噪聲標志位)

數據采樣

上位機控制stm32,單片機學習筆記,stm32,單片機,嵌入式硬件,c語言

  • 8、9、10次采樣每3位也至少應該有兩個0(只有兩個0會在狀態(tài)寄存器里置NE, 噪聲標志位)

波特率發(fā)生器

  • 發(fā)送器和接收器的波特率由波特率寄存器BRR里的DIV確定
  • 計算公式: 波特率 = fPCLK2/1 /(16 * DIV)

上位機控制stm32,單片機學習筆記,stm32,單片機,嵌入式硬件,c語言

案例: 上位機控制LED亮滅

上位機控制stm32,單片機學習筆記,stm32,單片機,嵌入式硬件,c語言

說明:

按鍵輸入端為PA1 采用EXTI中斷

PA0輸出控制LED1, PA2輸出控制LED2

LED2可通過按鍵控制

LED1通過上位機下達指令控制

利用Timer定時器每隔十秒進入一次中斷, 獲取LED1和LED2的亮滅狀態(tài)

硬件接線

上位機控制stm32,單片機學習筆記,stm32,單片機,嵌入式硬件,c語言

PA0接LED1, PA1接按鍵,PA2接LED2,PA9為單片機的Tx發(fā)送端接CH3400的Rx端,PA10為單片機的Rx接收斷接CH3400的Tx端

初始化USART

/*
串口通信初始化函數 搶占優(yōu)先級0 響應優(yōu)先級0
*/
void Serial_Init(void)  
{
	// RCC使能時鐘
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	// 配置GPIO
	// TX 發(fā)送端
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	// RX 接收斷
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	// 配置USART串口通信
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate=9600;  // 波特率
	USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;  // 無流控
	USART_InitStructure.USART_Mode=USART_Mode_Rx | USART_Mode_Tx;  // 兩種模式都打開
	USART_InitStructure.USART_Parity=USART_Parity_No;  // 奇偶校驗
	USART_InitStructure.USART_StopBits=USART_StopBits_1;  // 停止位
	USART_InitStructure.USART_WordLength=USART_WordLength_8b;  // 8位
	USART_Init(USART1, &USART_InitStructure);
	
	// 打開USART中斷
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  // 接收寄存器非空(正在接收)
	
	// 配置NVIC
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel= USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
	NVIC_Init(&NVIC_InitStructure);
	
	// 啟動USART
	USART_Cmd(USART1, ENABLE);
}

主要代碼

Serial.c
#include "stm32f10x.h"

char Down_String[] = "AABBCCDD01000000\r\n";  // 保存從下位機獲取的數據
char Header[] = "AABBCCDD00";  // 協議頭+數據來源
char Up_String[100];  // 保存從上位機傳送來的數據
uint8_t idx;  //下標 
uint8_t Decode_Flag;
/*
串口通信初始化函數 搶占優(yōu)先級0 響應優(yōu)先級0
*/
void Serial_Init(void)  
{
	// RCC使能時鐘
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	// 配置GPIO
	// TX 發(fā)送端
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	// RX 接收斷
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	// 配置USART串口通信
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate=9600;  // 波特率
	USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;  // 無流控
	USART_InitStructure.USART_Mode=USART_Mode_Rx | USART_Mode_Tx;
	USART_InitStructure.USART_Parity=USART_Parity_No;  // 奇偶校驗
	USART_InitStructure.USART_StopBits=USART_StopBits_1;  // 停止位
	USART_InitStructure.USART_WordLength=USART_WordLength_8b;  // 8位
	USART_Init(USART1, &USART_InitStructure);
	
	// 打開USART中斷
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  // 接收寄存器非空(正在接收)
	
	// 配置NVIC
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel= USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
	NVIC_Init(&NVIC_InitStructure);
	
	// 啟動USART
	USART_Cmd(USART1, ENABLE);
}

/*
	發(fā)送單個數據
*/
void Send_Byte(uint16_t Byte)
{
	USART_SendData(USART1, Byte);
	while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  // 等待發(fā)送完畢
}

/*
	發(fā)送字符串
*/
void Serial_SendString(char * String)
{
	uint8_t i;
	for(i=0; String[i] != '\0'; ++i)
	{
		Send_Byte(String[i]);
	}
}

/*
	向上位機傳送監(jiān)控的信息
*/
void Transimit_Message(void)
{
	Serial_SendString((char*)Down_String);
}

/*
	獲取LED信息 LED為低電平驅動
*/
void Get_LEDInfo(void)
{
	// LED1 
	if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==1){ // LED1滅
		Down_String[11] = '0';
	}else{
		Down_String[11] = '1';
	}
	// LED2
	if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)==1){ // LED2滅
		Down_String[13] = '0';
	}else{
		Down_String[13] = '1';
	}
}

/*
	下位機解碼上位機傳送的信息
*/
uint8_t Decode_Info(char * String)
{
	for(uint8_t i=0; i < 8; ++i)
	{
		if(String[i] != Header[i])
		{
			return 0;
		}
	}
	// 判斷是否有保留位
	for(uint8_t i=12; i <= 15; ++i)
	{
		if(String[i] != '0') return 0;
	}
	// 控制LED1亮滅
	if(String[10] == '0' && String[11] == '1')
	{
		// 開燈
		GPIO_ResetBits(GPIOA, GPIO_Pin_0);
	}
	else if(String[10] == '0' && String[11] == '0')
	{
		// 關燈
		GPIO_SetBits(GPIOA, GPIO_Pin_0);
	}
	else return 0;
	
	return 1;
}

/*
	根據反饋解碼狀態(tài)打印信息
*/
void Decode_Info_Print(void)
{
	if(Decode_Flag == 0)
	{
		// 解碼失敗, 請用正確的協議進行通訊
		Serial_SendString("Decoded failed!\r\nPlease ensure the communication protocol is correct!\r\n");
	}
	else
	{
		// 解碼成功!LED1狀態(tài)轉換成功
		Serial_SendString("Decoded successful!\r\n");
	}
	Decode_Flag = 0;
}

/*
	中斷函數
*/
void USART1_IRQHandler(void)
{
	if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)  // 接受寄存器不空
	{		
		uint8_t Serial_RxData;
		Serial_RxData = USART_ReceiveData(USART1);  // 接受數據
		Up_String[idx++] = (char)Serial_RxData;
		// 清除中斷標志
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);
	}
}
Serial.h
#ifndef __SERIAL_H
#define __SERIAL_H
#include "stm32f10x.h"
void Serial_Init(void);
void Send_Byte(uint16_t Byte);
void Serial_SendString(char * String);
void Transimit_Message(void);
void Get_LEDInfo(void);
uint8_t Decode_Info(char * String);
void Decode_Info_Print(void);
extern char Down_String[];
extern char Header[];
extern uint8_t idx;
extern uint8_t Decode_Flag;
extern char Up_String[100];

#endif
LED.c
#include "stm32f10x.h"

/*
	初始化LED1
*/
void LED1_Init(void)
{
	// RCC使能時鐘
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	//初始化GPIO
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_SetBits(GPIOA, GPIO_Pin_0);  // 設置高電平
}

/*
	關燈 低電平驅動
*/
void LED1_Off(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_0);
}

/*
	開燈
*/
void LED1_On(void)
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_0);
}

/*
	翻轉燈泡狀態(tài)
*/
void LED1_Turn(void)
{
	if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==1){
		LED1_On();
	}else{
		LED1_Off();
	}
}

void LED2_Init(void)
{
	// RCC使能時鐘
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	//初始化GPIO
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_SetBits(GPIOA, GPIO_Pin_2);  // 設置高電平
}

/*
	關燈 低電平驅動
*/
void LED2_Off(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_2);
}

/*
	開燈
*/
void LED2_On(void)
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}

/*
	翻轉燈泡狀態(tài)
*/
void LED2_Turn(void)
{
	if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)==1){
		LED2_On();
	}else{
		LED2_Off();
	}
}
key.c
#include "stm32f10x.h"
#include "LED.h"

/*
	初始化按鍵 PA1 搶占優(yōu)先級1 響應優(yōu)先級1
*/
void Key_Init(void)
{
	// RCC使能時鐘
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	// 初始化GPIO
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;  // 上拉輸入
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1; // PA1
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	// 配置AFIO
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);
	
	// 配置中斷
	EXTI_InitTypeDef EXTI_InitStructure;
	EXTI_InitStructure.EXTI_Line=EXTI_Line1;
	EXTI_InitStructure.EXTI_LineCmd=ENABLE;
	EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
	EXTI_Init(&EXTI_InitStructure);
	//配置NVIC
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&NVIC_InitStructure);
	
}

/*
	按鍵中斷函數
*/
void EXTI1_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line1) == SET)
	{
		if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==0)
		{	
			LED2_Turn();
		}
		// 清除中斷標志
		EXTI_ClearITPendingBit(EXTI_Line1);
	}
}
Timer.c
#include "stm32f10x.h"
#include "Serial.h"
/*
	初始化定時器 搶占優(yōu)先級0 響應優(yōu)先級1 
*/
void Timer_Init(void)
{
	// RCC開啟時鐘
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
	// 選擇時鐘源
	TIM_InternalClockConfig(TIM2);  // 內部時鐘
	
	// 配置時基單元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;  // 內部時鐘分頻
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;  // 計數模式
	TIM_TimeBaseInitStructure.TIM_Period=50000-1;  // 加載到自動重裝寄存器的值
	TIM_TimeBaseInitStructure.TIM_Prescaler=7200-1;  // 預分頻的值
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;  // 重復計數器的值 
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);  //
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);  // 清除標志
	// 使能更新中斷
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
	
	// 配置NVIC
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;  // 中斷通道
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;  
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;  // 搶占優(yōu)先級
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;  // 響應優(yōu)先級
	NVIC_Init(&NVIC_InitStructure);
	
	// 啟動定時器
	TIM_Cmd(TIM2, ENABLE);
	return;
}

/*
	10秒鐘進入一次中斷 獲取系統(tǒng)信息
*/
void TIM2_IRQHandler(void)
{
	// 判斷標志位
	if (TIM_GetITStatus(TIM2, TIM_IT_Update)==SET)
	{
		// 獲取LED信息
		Get_LEDInfo();
		// 將信息發(fā)送給上位機
		Transimit_Message();
		// 清除標志位
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
}
main.c
#include "stm32f10x.h" 
#include "delay.h"
#include "LED.h"  
#include "key.h"
#include "Timer.h"  // 定時器 10s 獲取一次信息
#include "Serial.h"  // 串口相關程序
// 上位機控制LED亮滅
int main(void)
{
	LED1_Init();
	LED2_Init();
	Key_Init();
	Timer_Init();
	Serial_Init();
	while(1)
	{
		// 接收到一個完整協議的數據 進行解析
		if(idx >= 16)
		{
			// 解碼
			Decode_Flag = Decode_Info((char*)Up_String);
			// 打印解碼信息
			Decode_Info_Print();  
			idx = 0;
		}
	}
}

效果展示

上位機控制stm32,單片機學習筆記,stm32,單片機,嵌入式硬件,c語言
上位機控制stm32,單片機學習筆記,stm32,單片機,嵌入式硬件,c語言
上位機控制stm32,單片機學習筆記,stm32,單片機,嵌入式硬件,c語言

視頻鏈接

【單片機作業(yè): USART通信案例上位機控制LED燈亮滅】

參考資料

嵌入式單片機STM32原理及應用
【STM32入門教程-2023持續(xù)更新中】文章來源地址http://www.zghlxwxcb.cn/news/detail-702503.html

到了這里,關于STM32入門筆記10_USART串口通信+案例:上位機控制LED亮滅(USART串口通信、TIM定時器、EXTI綜合案例)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • stm32中常見的通信協議之USART(串口)

    stm32中常見的通信協議之USART(串口)

    USART是一種通用的串行、異步通信總線,該總線有兩條數據線,可以實現全雙工的發(fā)送和接收。 串口的通信速度用波特率來表示,其單位為bps(bit per second)即每秒鐘傳送bit的數量。 串口規(guī)定,數據線在空閑的狀態(tài)下,必須是置為高電平的狀態(tài)。 起始信號為低電平,因為串口

    2023年04月08日
    瀏覽(23)
  • STM32 串口通信USART1的配置和使用

    STM32 串口通信USART1的配置和使用

    UART:universal asynchronous receiver and transmitter通用異步收發(fā)器 USART:universal synchronous asynchronous receiver and transmitter通用同步異步收發(fā)器 上圖是利用寄存器配置的步驟,下面我用官方庫函數配置USART1 1、要配置串口usart1,先查看數據手冊以及開發(fā)板原理圖的芯片管腳 根據上圖可以看

    2024年02月05日
    瀏覽(26)
  • STM32F4 基于USART串口的藍牙通信

    STM32F4 基于USART串口的藍牙通信

    目錄 一、硬件資源 連接方案 其他配置 二、實驗原理 基本定義 USART介紹 USART工作原理 數據發(fā)送 數據接收 藍牙HM-10配置 三、代碼部分 usart.c usart.h Serial.c Serial.h main.c 結語 STM32F401,OLED,藍牙hm10 連接方案 設備1的TX與設備2的RX連接,這樣設備1發(fā)送的數據可以被設備2接收到。

    2024年01月17日
    瀏覽(52)
  • 【嵌入式學習-STM32F103-USART串口通信】

    【嵌入式學習-STM32F103-USART串口通信】

    4-1 基本流程 4-2 整體代碼 4-2-1 main.c 4-2-2 Serial.c 4-2-3 Serial.h 5-1 查詢 5-2 中斷 5-3 整體代碼 5-3-1 main.c 5-3-2 Serial.c 5-3-3 Serial.h 6-1 使用狀態(tài)機接收數據包的思路 6-2 串口收發(fā)HEX數據包 6-2-1 main.c 6-2-2 Serial.c 6-2-3 Serial.h 6-3串口收發(fā)文本數據包 6-3-1 main.c 6-3-2 Serial.c 6-3-3 Serial.h 全雙工:打

    2024年02月15日
    瀏覽(64)
  • STM32串口通信中的USART_RecieveData函數分析

    STM32串口通信中的USART_RecieveData函數分析

    拿這個中斷函數為例 ????????很多人可能注意到了接收數據函數的返回類型為無符號短整型,疑惑這里為什么用了一個無符號字符類型變量rec接收。 先看看這個函數的定義 ????????其實,是因為串口設置的字長為8,所以數據寄存器中第八位為0,第0~7位為數據有效位,

    2024年02月11日
    瀏覽(50)
  • 【STM32】STM32學習筆記-USART串口協議(25)

    【STM32】STM32學習筆記-USART串口協議(25)

    按數據傳送的方式,通訊可分為串行通訊與并行通訊,串行通訊是指設備之間通過少量數據信號線(一般是8根以下), 地線以及控制信號線,按數據位形式一位一位地傳輸數據的通訊方式。而并行通訊一般是指使用8、16、32及64根或更多的數據線進行傳輸的通訊方式, 它們的通

    2024年01月19日
    瀏覽(26)
  • stm32學習筆記-9 USART串口

    stm32學習筆記-9 USART串口

    注:筆記主要參考B站 江科大自化協 教學視頻“STM32入門教程-2023持續(xù)更新中”。 注:工程及代碼文件放在了本人的Github倉庫。 從本節(jié)開始,將逐一學習STM32的通信接口。首先介紹以下stm32都集成了什么通信外設。 為了控制或讀取外掛模塊,stm32需要與外掛模塊進行通信,來擴

    2024年02月14日
    瀏覽(20)
  • 【STM32】STM32學習筆記-USART串口數據包(28)

    【STM32】STM32學習筆記-USART串口數據包(28)

    串口通訊(Serial Communication)是一種設備間非常常用的串行通訊方式,因為它簡單便捷,因此大部分電子設備都支持該通訊方式, 電子工程師在調試設備時也經常使用該通訊方式輸出調試信息。 在計算機科學里,大部分復雜的問題都可以通過分層來簡化。如芯片被分為內核層和

    2024年01月18日
    瀏覽(33)
  • 【Qt上位機與STM32進行串口通信】-2-Qt串口開發(fā)

    【Qt上位機與STM32進行串口通信】-2-Qt串口開發(fā)

    系列文章目標:Qt上位機與STM32進行串口通信,控制多個LED的狀態(tài)。 本篇文章的主要目標: 1、設計兩個界面,串口連接界面、控制界面。 2、只有在串口連接成功才能打開控制界面。 3、打開控制界面時,串口保持連接。 4、自定義控件,提升開發(fā)效率。 以下是我入門Qt的視頻

    2024年02月06日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包