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

【STM32】STM32學(xué)習(xí)筆記-USART串口收發(fā)HEX和文本數(shù)據(jù)包(29)

這篇具有很好參考價(jià)值的文章主要介紹了【STM32】STM32學(xué)習(xí)筆記-USART串口收發(fā)HEX和文本數(shù)據(jù)包(29)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

00. 目錄

01. 串口簡(jiǎn)介

串口通訊(Serial Communication)是一種設(shè)備間非常常用的串行通訊方式,因?yàn)樗?jiǎn)單便捷,因此大部分電子設(shè)備都支持該通訊方式, 電子工程師在調(diào)試設(shè)備時(shí)也經(jīng)常使用該通訊方式輸出調(diào)試信息。

在計(jì)算機(jī)科學(xué)里,大部分復(fù)雜的問(wèn)題都可以通過(guò)分層來(lái)簡(jiǎn)化。如芯片被分為內(nèi)核層和片上外設(shè);STM32標(biāo)準(zhǔn)庫(kù)則是在寄存器與用戶(hù)代碼之間的軟件層。 對(duì)于通訊協(xié)議,我們也以分層的方式來(lái)理解,最基本的是把它分為物理層和協(xié)議層。物理層規(guī)定通訊系統(tǒng)中具有機(jī)械、電子功能部分的特性, 確保原始數(shù)據(jù)在物理媒體的傳輸。協(xié)議層主要規(guī)定通訊邏輯,統(tǒng)一收發(fā)雙方的數(shù)據(jù)打包、解包標(biāo)準(zhǔn)。 簡(jiǎn)單來(lái)說(shuō)物理層規(guī)定我們用嘴巴還是用肢體來(lái)交流,協(xié)議層則規(guī)定我們用中文還是英文來(lái)交流。

02. 串口收發(fā)HEX數(shù)據(jù)包接線圖

【STM32】STM32學(xué)習(xí)筆記-USART串口收發(fā)HEX和文本數(shù)據(jù)包(29),STM32F103,stm32,學(xué)習(xí),筆記,江科大,江科大stm32,UART,串口

03. 串口收發(fā)HEX數(shù)據(jù)包示例1

uart.h

#ifndef __UART_H__
#define __UART_H__

#include "stm32f10x.h"    

extern uint8_t recvPacket[];


void uart_init(void);

void uart_send_byte(uint8_t byte);

void uart_send_array(uint8_t *arr, uint16_t len);


void uart_send_string(char *str);

void uart_send_number(uint32_t num, uint8_t len);

void uart_printf(char *format, ...);

uint8_t uart_getRxFlag(void);


uint8_t uart_getRxData(void);

void uart_send_packet(uint8_t arr[], int len);


#endif /**/


uart.c

#include "uart.h"

#include <stdio.h>
#include <stdarg.h>

uint8_t recvData;
uint8_t recvFlag;

uint8_t recvPacket[32];

void uart_init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	USART_InitTypeDef USART_InitStruct;
	NVIC_InitTypeDef NVIC_InitStruct;
	
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

	//GPIO初始化  PA9 TX
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	//GPIO初始化  PA10 RX
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);

	USART_InitStruct.USART_BaudRate = 9600;
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
	USART_InitStruct.USART_Parity = USART_Parity_No;
	USART_InitStruct.USART_StopBits = USART_StopBits_1;
	USART_InitStruct.USART_WordLength = USART_WordLength_8b;
	
	USART_Init(USART1, &USART_InitStruct);
	
	//設(shè)置串口中斷
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
	
	//設(shè)置中斷分組
	NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStruct);
	
	USART_Cmd(USART1, ENABLE);
}

void uart_send_byte(uint8_t byte)
{
	USART_SendData(USART1, byte);
	
	while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}


void uart_send_array(uint8_t *arr, uint16_t len)
{
	uint16_t i;
	for (i = 0; i < len; i++)
	{
		uart_send_byte(arr[i]);
	}
}


void uart_send_string(char *str)
{
	uint16_t i = 0;
	
	while(*(str + i) != '\0')
	{
		uart_send_byte(str[i]);
		i++;
	}
}

//x的y次方
uint32_t uart_pow(uint32_t x, uint32_t y)
{
	uint32_t result = 1;
	
	while(y)
	{
		result *= x;
		y--;
	}
	
	return result;
}

void uart_send_number(uint32_t num, uint8_t len)
{
	uint8_t i;
	for (i = 0; i < len; i++)
	{
		uart_send_byte(num / uart_pow(10, len - i - 1) % 10 + '0');
	}
	
}

int fputc(int ch, FILE *fp)
{
	uart_send_byte(ch);
	
	return ch;
}


void uart_printf(char *format, ...)
{
	char str[128];
	
	va_list arg;
	va_start(arg, format);
	vsprintf(str, format, arg);
	va_end(arg);
	
	uart_send_string(str);
}

void USART1_IRQHandler(void)
{
	static uint8_t recvState = 0;
	static uint8_t i = 0;
	
	if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
	{
		recvData = USART_ReceiveData(USART1);
		
		//狀態(tài)機(jī)
		if (0 == recvState)
		{
			if (recvData == 0xFF)
			{
				recvState = 1;
				i = 0;
			}
		}
		else if (1 == recvState)
		{
			recvPacket[i] = recvData;
			i++;
			
			if (i >= 4)
			{
				recvState = 2;
			}
		} 
		else if (2 == recvState)
		{
			if (recvData == 0xFE)
			{
				i = 0;
				recvState = 0;
				recvFlag = 1;
			}
		
		}

		
	
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);
	}

}

uint8_t uart_getRxFlag(void)
{
	if (1 == recvFlag)
	{
		recvFlag = 0;
		return 1;
	}
	return 0;
}


uint8_t uart_getRxData(void)
{
	return recvData;
}


//發(fā)送HEX報(bào)文數(shù)據(jù)
void uart_send_packet(uint8_t arr[], int len)
{
	//發(fā)送報(bào)文 FF
	uart_send_byte(0xFF);
	
	
	uart_send_array(arr, len);
	
	//發(fā)送報(bào)尾
	uart_send_byte(0xFE);	
}

main.c

#include "stm32f10x.h"
#include <stdio.h>
#include "delay.h"
#include "oled.h"
#include "uart.h"


 int main(void)
 {	 
	 
	 uint8_t arr[] = {0x1, 0x2, 0x3, 0x4};
	 OLED_Init();
	 
	 uart_init();
	 
	 //中斷分組
	 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

	 OLED_ShowChar(1, 1, 'A');

	
	 uart_send_packet(arr, 4);
		 
	 while(1)
	 {
		 if (1 == uart_getRxData())
		 {
			OLED_ShowHexNum(1, 1, recvPacket[0], 2);
			OLED_ShowHexNum(1, 4, recvPacket[1], 2);
			OLED_ShowHexNum(1, 7, recvPacket[2], 2);
			OLED_ShowHexNum(1, 10, recvPacket[3], 2);			 
		 }	 
	 }
	 
	 return 0;
 }


 

04. 串口收發(fā)HEX數(shù)據(jù)包示例2

uart.h

#ifndef __UART_H__
#define __UART_H__

#include "stm32f10x.h"    

extern uint8_t recvPacket[];


void uart_init(void);

void uart_send_byte(uint8_t byte);

void uart_send_array(uint8_t *arr, uint16_t len);


void uart_send_string(char *str);

void uart_send_number(uint32_t num, uint8_t len);

void uart_printf(char *format, ...);

uint8_t uart_getRxFlag(void);


uint8_t uart_getRxData(void);

void uart_send_packet(uint8_t arr[], int len);


#endif /**/


uart.c

#include "uart.h"

#include <stdio.h>
#include <stdarg.h>

uint8_t recvData;
uint8_t recvFlag;

uint8_t recvPacket[32];

void uart_init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	USART_InitTypeDef USART_InitStruct;
	NVIC_InitTypeDef NVIC_InitStruct;
	
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

	//GPIO初始化  PA9 TX
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	//GPIO初始化  PA10 RX
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);

	USART_InitStruct.USART_BaudRate = 9600;
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
	USART_InitStruct.USART_Parity = USART_Parity_No;
	USART_InitStruct.USART_StopBits = USART_StopBits_1;
	USART_InitStruct.USART_WordLength = USART_WordLength_8b;
	
	USART_Init(USART1, &USART_InitStruct);
	
	//設(shè)置串口中斷
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
	
	//設(shè)置中斷分組
	NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStruct);
	
	USART_Cmd(USART1, ENABLE);
}

void uart_send_byte(uint8_t byte)
{
	USART_SendData(USART1, byte);
	
	while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}


void uart_send_array(uint8_t *arr, uint16_t len)
{
	uint16_t i;
	for (i = 0; i < len; i++)
	{
		uart_send_byte(arr[i]);
	}
}


void uart_send_string(char *str)
{
	uint16_t i = 0;
	
	while(*(str + i) != '\0')
	{
		uart_send_byte(str[i]);
		i++;
	}
}

//x的y次方
uint32_t uart_pow(uint32_t x, uint32_t y)
{
	uint32_t result = 1;
	
	while(y)
	{
		result *= x;
		y--;
	}
	
	return result;
}

void uart_send_number(uint32_t num, uint8_t len)
{
	uint8_t i;
	for (i = 0; i < len; i++)
	{
		uart_send_byte(num / uart_pow(10, len - i - 1) % 10 + '0');
	}
	
}

int fputc(int ch, FILE *fp)
{
	uart_send_byte(ch);
	
	return ch;
}


void uart_printf(char *format, ...)
{
	char str[128];
	
	va_list arg;
	va_start(arg, format);
	vsprintf(str, format, arg);
	va_end(arg);
	
	uart_send_string(str);
}

void USART1_IRQHandler(void)
{
	static uint8_t recvState = 0;
	static uint8_t i = 0;
	
	if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
	{
		uint8_t recvData1 = USART_ReceiveData(USART1);
		
		//狀態(tài)機(jī)
		if (0 == recvState)
		{
			if (recvData1 == 0xFF)
			{
				recvState = 1;
				i = 0;
			}
		}
		else if (1 == recvState)
		{
			recvPacket[i] = recvData1;
			i++;
			
			if (i >= 4)
			{
				recvState = 2;
			}
		} 
		else if (2 == recvState)
		{
			if (recvData1 == 0xFE)
			{
				recvState = 0;
				recvFlag = 1;
			}
		
		}

		
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);
	}
}

uint8_t uart_getRxFlag(void)
{
	if (1 == recvFlag)
	{
		recvFlag = 0;
		return 1;
	}
	return 0;
}


uint8_t uart_getRxData(void)
{
	return recvData;
}


//發(fā)送HEX報(bào)文數(shù)據(jù)
void uart_send_packet(uint8_t arr[], int len)
{
	//發(fā)送報(bào)文 FF
	uart_send_byte(0xFF);
	
	
	uart_send_array(arr, len);
	
	//發(fā)送報(bào)尾
	uart_send_byte(0xFE);	
}

main.c

#include "stm32f10x.h"
#include <stdio.h>
#include "delay.h"
#include "oled.h"
#include "uart.h"
#include "key.h"


 int main(void)
 {	 
	 
	 uint8_t arr[] = {0x1, 0x2, 0x3, 0x4};

	 

	 
	 //中斷分組
	 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

	 key_init();
	 
	 uart_init();
	 
	OLED_Init();
	 
	 
	 OLED_ShowString(1, 1, "TxPacket");
	 OLED_ShowString(3, 1, "RxPacket");

 
	 while(1)
	 {
		 if (1 == key_scan())
		 {
			arr[0]++;
			arr[1]++; 
			arr[2]++;
			arr[3]++;
			 
			uart_send_packet(arr, 4); 
			
			OLED_ShowHexNum(2, 1, arr[0], 2);
			OLED_ShowHexNum(2, 4, arr[1], 2);
			OLED_ShowHexNum(2, 7, arr[2], 2);
			OLED_ShowHexNum(2, 10, arr[3], 2);			 
		 } 
		 if (1 == uart_getRxData())
		 {
			OLED_ShowHexNum(4, 1, recvPacket[0], 2);
			OLED_ShowHexNum(4, 4, recvPacket[1], 2);
			OLED_ShowHexNum(4, 7, recvPacket[2], 2);
			OLED_ShowHexNum(4, 10, recvPacket[3], 2);			 
		 }	 
	 }
	 
	 return 0;
 }

05. 串口收發(fā)文本數(shù)據(jù)包接線圖

【STM32】STM32學(xué)習(xí)筆記-USART串口收發(fā)HEX和文本數(shù)據(jù)包(29),STM32F103,stm32,學(xué)習(xí),筆記,江科大,江科大stm32,UART,串口

06. 串口收發(fā)文本數(shù)據(jù)包示例

uart.h

#ifndef __SERIAL_H
#define __SERIAL_H

#include <stdio.h>

extern uint8_t Serial_TxPacket[];
extern uint8_t Serial_RxPacket[];
extern uint8_t Serial_RxFlag;

void Serial_Init(void);
void Serial_SendByte(uint8_t Byte);
void Serial_SendArray(uint8_t *Array, uint16_t Length);
void Serial_SendString(char *String);
void Serial_SendNumber(uint32_t Number, uint8_t Length);
void Serial_Printf(char *format, ...);

void Serial_SendPacket(void);


#endif

uart.c

#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <stdarg.h>


uint8_t Serial_TxPacket[4];				//FF 01 02 03 04 FE
char Serial_RxPacket[100];
uint8_t Serial_RxFlag;

void Serial_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	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);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate = 9600;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_Init(USART1, &USART_InitStructure);
	
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);
	
	USART_Cmd(USART1, ENABLE);
}

void Serial_SendByte(uint8_t Byte)
{
	USART_SendData(USART1, Byte);
	while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}

void Serial_SendArray(uint8_t *Array, uint16_t Length)
{
	uint16_t i;
	for (i = 0; i < Length; i ++)
	{
		Serial_SendByte(Array[i]);
	}
}

void Serial_SendString(char *String)
{
	uint8_t i;
	for (i = 0; String[i] != '\0'; i ++)
	{
		Serial_SendByte(String[i]);
	}
}

uint32_t Serial_Pow(uint32_t X, uint32_t Y)
{
	uint32_t Result = 1;
	while (Y --)
	{
		Result *= X;
	}
	return Result;
}

void Serial_SendNumber(uint32_t Number, uint8_t Length)
{
	uint8_t i;
	for (i = 0; i < Length; i ++)
	{
		Serial_SendByte(Number / Serial_Pow(10, Length - i - 1) % 10 + '0');
	}
}

int fputc(int ch, FILE *f)
{
	Serial_SendByte(ch);
	return ch;
}

void Serial_Printf(char *format, ...)
{
	char String[100];
	va_list arg;
	va_start(arg, format);
	vsprintf(String, format, arg);
	va_end(arg);
	Serial_SendString(String);
}


void Serial_SendPacket(void)
{
	Serial_SendByte(0xFF);
	Serial_SendArray(Serial_TxPacket, 4);
	Serial_SendByte(0xFE);
}


void USART1_IRQHandler(void)
{
	static uint8_t RxState = 0;
	static uint8_t pRxPacket = 0;
	if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
	{
		uint8_t RxData = USART_ReceiveData(USART1);
		
		if (RxState == 0)
		{
			if (RxData == '@' && 0 == Serial_RxFlag)
			{
				RxState = 1;
				pRxPacket = 0;
			}
		}
		else if (RxState == 1)
		{

			if (RxData == '\r')
			{
				RxState = 2;
				
			}
			else
			{
				Serial_RxPacket[pRxPacket] = RxData;
				pRxPacket ++;
			}
		}
		else if (RxState == 2)
		{
			if (RxData == '\n')
			{
				RxState = 0;
				Serial_RxPacket[pRxPacket] = '\0';
				Serial_RxFlag = 1;
			}
		}
		
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);
	}
}

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"
#include "LED.h"

#include <string.h>

int main(void)
{
	OLED_Init();
		LED_Init();
	Serial_Init();

	
	OLED_ShowString(1, 1, "TxPacket");
	OLED_ShowString(3, 1, "RxPacket");
	
	
	while (1)
	{
		
		if (Serial_RxFlag == 1)
		{
			OLED_ShowString(4, 1, "                     ");
			OLED_ShowString(4, 1, Serial_RxPacket);
			
			if (strcmp(Serial_RxPacket, "LED_ON") == 0)
			{
				LED1_ON();
				OLED_ShowString(2, 1, "                     ");
				OLED_ShowString(2, 1, "LED_ON_OK");
				Serial_SendString("LED_ON_OK\r\n");
			}
			else if (strcmp(Serial_RxPacket, "LED_OFF") == 0)
			{
				LED1_OFF();
				OLED_ShowString(2, 1, "                     ");
				OLED_ShowString(2, 1, "LED_OFF_OK");	
				Serial_SendString("LED_OFF_OK\r\n");				
			}
			else
			{
				OLED_ShowString(2, 1, "                     ");
				OLED_ShowString(2, 1, "ERROR_COMMAND");	
				Serial_SendString("ERROR_COMMAND\r\n");				
			}
			
			Serial_RxFlag = 0;
		}
	}
}

07. 程序示例下載

24-UART收發(fā)HEX數(shù)據(jù)包

25-UART收發(fā)HEX數(shù)據(jù)包2.rar

26-UART收發(fā)文本數(shù)據(jù)包.rar

08. 附錄

參考: 【STM32】江科大STM32學(xué)習(xí)筆記匯總文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-803525.html

到了這里,關(guān)于【STM32】STM32學(xué)習(xí)筆記-USART串口收發(fā)HEX和文本數(shù)據(jù)包(29)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • HAL庫(kù)STM32CUBEMX學(xué)習(xí)記錄(一)——USART(串口中斷收發(fā)數(shù)據(jù))

    HAL庫(kù)STM32CUBEMX學(xué)習(xí)記錄(一)——USART(串口中斷收發(fā)數(shù)據(jù))

    一、首先使用STM32CUBEMX新建一個(gè)工程 二、打開(kāi)工程文件 1.在usart.c中添加以下代碼 ?2.然后在最后面加入中斷回調(diào)函數(shù) 3.在usart.h文件中加入 ?4.新建一個(gè)cmd.c文件,創(chuàng)建命令check函數(shù) 5.在mian函數(shù)中的while(1)循環(huán)中調(diào)用USART1_Check(USART_RX_BUF)函數(shù) 6.最后串口初始化函數(shù)后打開(kāi)串口中

    2024年02月16日
    瀏覽(29)
  • stm32F407學(xué)習(xí)DAY.14 在DMA模式下進(jìn)行USART串口數(shù)據(jù)收發(fā)(正點(diǎn)原子例程為例)

    stm32F407學(xué)習(xí)DAY.14 在DMA模式下進(jìn)行USART串口數(shù)據(jù)收發(fā)(正點(diǎn)原子例程為例)

    目錄 一、DMA配置 1、DMA1和DMA2的請(qǐng)求映射 2、DMA掛載總線 3、DMA相關(guān)庫(kù)函數(shù) ?4、DMA配置過(guò)程(以串口1為例) 1)進(jìn)行時(shí)鐘使能 2)等待DMA可配置 3)初始化DMA(串口1的TX為DMA2 數(shù)據(jù)流7 通道4,RX為DMA2 數(shù)據(jù)流5?通道4) a.DMA外設(shè)地址par: b.DMA存儲(chǔ)器0地址mar: c.數(shù)據(jù)傳輸量ndtr: 4)

    2024年02月04日
    瀏覽(22)
  • 【STM32】STM32學(xué)習(xí)筆記-USART串口數(shù)據(jù)包(28)

    【STM32】STM32學(xué)習(xí)筆記-USART串口數(shù)據(jù)包(28)

    串口通訊(Serial Communication)是一種設(shè)備間非常常用的串行通訊方式,因?yàn)樗?jiǎn)單便捷,因此大部分電子設(shè)備都支持該通訊方式, 電子工程師在調(diào)試設(shè)備時(shí)也經(jīng)常使用該通訊方式輸出調(diào)試信息。 在計(jì)算機(jī)科學(xué)里,大部分復(fù)雜的問(wèn)題都可以通過(guò)分層來(lái)簡(jiǎn)化。如芯片被分為內(nèi)核層和

    2024年01月18日
    瀏覽(33)
  • 【江科大】STM32:串口HEX/文本數(shù)據(jù)接收和發(fā)送(代碼部分)(下)

    【江科大】STM32:串口HEX/文本數(shù)據(jù)接收和發(fā)送(代碼部分)(下)

    串口收發(fā)HEX數(shù)據(jù)包 2. 將跳線帽置在boot1 按復(fù)位鍵,點(diǎn)擊開(kāi)始編程即可。 由于該單片機(jī)只有串口1支持串口燒錄。因此連接線連在串口1的所在的引腳上。 程序加載到bootloader完成后,再將跳線帽換到boot0,按復(fù)位鍵 為什么可以使用串口下載? 原理是實(shí)現(xiàn)程序的自我更新,即利用

    2024年04月22日
    瀏覽(20)
  • stm32學(xué)習(xí)筆記-9 USART串口

    stm32學(xué)習(xí)筆記-9 USART串口

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

    2024年02月14日
    瀏覽(20)
  • 【STM32】STM32學(xué)習(xí)筆記-USART串口協(xié)議(25)

    【STM32】STM32學(xué)習(xí)筆記-USART串口協(xié)議(25)

    按數(shù)據(jù)傳送的方式,通訊可分為串行通訊與并行通訊,串行通訊是指設(shè)備之間通過(guò)少量數(shù)據(jù)信號(hào)線(一般是8根以下), 地線以及控制信號(hào)線,按數(shù)據(jù)位形式一位一位地傳輸數(shù)據(jù)的通訊方式。而并行通訊一般是指使用8、16、32及64根或更多的數(shù)據(jù)線進(jìn)行傳輸?shù)耐ㄓ嵎绞剑?它們的通

    2024年01月19日
    瀏覽(27)
  • 18、江科大stm32視頻學(xué)習(xí)筆記——USART串口發(fā)送&串口發(fā)送和接收

    18、江科大stm32視頻學(xué)習(xí)筆記——USART串口發(fā)送&串口發(fā)送和接收

    目錄 一、USART串口發(fā)送? 1、電路圖 2、printf函數(shù)的移植方法 3、serial.c 4、main.c 5、解決直接寫(xiě)漢字,編譯器報(bào)錯(cuò) 二 、USART串口發(fā)送和接收 1、查詢(xún)實(shí)現(xiàn) 2、中斷實(shí)現(xiàn)? (1)在Serial.c中添加的代碼 (2)主函數(shù)中調(diào)用 (3)思路 (4)完整的Serial.c代碼 (5)mian.c ?要交叉連接,所

    2023年04月08日
    瀏覽(20)
  • STM32學(xué)習(xí)筆記(五)串口空閑中斷+DMA實(shí)現(xiàn)不定長(zhǎng)收發(fā)(stm32c8t6)

    STM32學(xué)習(xí)筆記(五)串口空閑中斷+DMA實(shí)現(xiàn)不定長(zhǎng)收發(fā)(stm32c8t6)

    記錄一下學(xué)習(xí)過(guò)程 DMA DMA,全稱(chēng)為: Direct Memory Access,即直接存儲(chǔ)器訪問(wèn), DMA 傳輸將數(shù)據(jù)從一個(gè) 地址空間復(fù)制到另外一個(gè)地址空間。 這一過(guò)程無(wú)需cpu的參與,從而提高cpu使用的效率 DMA相關(guān)的參數(shù):1 數(shù)據(jù)的源地址、2 數(shù)據(jù)傳輸?shù)哪繕?biāo)地址 、3 傳輸寬度,4 傳輸多少字節(jié),5 傳

    2024年02月14日
    瀏覽(21)
  • STM32 F103C8T6學(xué)習(xí)筆記3:串口配置—串口收發(fā)—自定義Printf函數(shù)

    STM32 F103C8T6學(xué)習(xí)筆記3:串口配置—串口收發(fā)—自定義Printf函數(shù)

    今日學(xué)習(xí)使用STM32 C8T6的串口,我們?cè)诮?jīng)過(guò)學(xué)習(xí)筆記2的總結(jié)歸納可知,STM32 C8T6最小系統(tǒng)板上有三路串口,如下圖: ?今日我們就著手學(xué)習(xí)如何配置開(kāi)通這些串口進(jìn)行收發(fā),這里不講串口通信概念與基礎(chǔ),可以自行網(wǎng)上查找,本文直接開(kāi)始介紹庫(kù)函數(shù)與編程實(shí)現(xiàn): ? ? ? ? ?

    2024年02月10日
    瀏覽(30)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包