当前位置:网站首页>Expérience de port série - simple réception et réception de données
Expérience de port série - simple réception et réception de données
2022-07-07 08:58:00 【Un gros chat 1201】
Auteur:Un gros chat1201
Colonne:《STM32Apprendre》
Devise:Tu n'as qu'à essayer.,Laisse le reste.!
Expérience de port série
Description
Port série comme MCU Interfaces externes importantes pour,C'est aussi un important moyen de débogage pour le développement de logiciels,Son importance va de soi.Maintenant, presque tout MCU Avec des ports série,STM32 La nature ne fait pas exception..
STM32 Les ressources du port série de,La fonctionnalité est également assez forte.Ben MIAOU a utiliséSTM32F103ZET6 Disponible jusqu'à 5 Port série,Il y a un générateur de taux de Baud fractionnel、Prise en charge de la communication monoligne synchrone et de la communication monoligne semi - duplex、Soutien LIN、.Prise en charge du fonctionnement du modem、Protocole de carte à puce et IrDA SIR ENDEC Spécifications、Avec DMAAttendez..
Recevoir l'étiquette d'état
#define USART_REC_LEN 200 //Définir le nombre maximum d'octets reçus 200
#define EN_USART1_RX 1 //Activer(1)/Interdiction(0)Port série1Réception
extern u8 USART_RX_BUF[USART_REC_LEN]; //Recevoir le tampon,Max.USART_REC_LENOctets.Le dernier octet est un saut de ligne
extern u16 USART_RX_STA; //Recevoir l'étiquette d'état
Dans les fonctions de bibliothèque officiellement disponibles usart.h Le nombre maximum d'octets reçus est défini dans ,- Oui.200Octets, Et un tableau a été créé , La taille du tableau est 200Octets, Chaque octet de données reçu est placé dans ce tableau .
Et en utilisant une variable USART_RX_STA, C'est une variable de l'état de réception d'une personne ,Sa taille est16Bits, C'est la taille de deux octets .
C'est le sens de chacun de ses représentants .
- 0À13 Bit stocke le nombre de données valides reçues , Chaque fois qu'une donnée valide est reçue ,- Oui.1.
- No14 Les délégués acceptent - ils 0X0DDonnées, C'est le caractère de retour . Nous avons des règles pour cette communication en série , C'est pour rentrer. (0X0D)Nouvelle ligne(0X0A) Le caractère met fin à la communication .Si les données reçues sont0X0DPlacez l'emplacement comme suit:1.
- No15 Bit représente si la réception est terminée . Si les données reçues sont 0X0D(Entrée du caractère) Les données suivantes sont 0X0A(Nouvelle ligne de caractères), Description réception terminée ,Placez l'emplacement comme suit:1.
Ce qui précède a été convenu entre nous avant la communication , Les deux parties à la communication ont décidé de suivre cet accord .
Configuration de la fonction
Notre expérience n'est qu'une simple transmission de données .5 Parmi les ports série , Nous choisissons le port série 1(UASRT1) Pour réaliser cette expérience .
Dans l'article de Ben MIAOU Configuration de la fonction de registre de port série Comment configurer le port série est décrit en détail dans , Ici Ben MIAOU va directement configurer , Plus de raison .
- ActiverGPIOAEtUSART1L'horloge de
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //ActiverUSART1,GPIOAHorloge
- ConfigurationGPIOABouche
GPIO_InitTypeDef GPIO_InitStructure;
//USART1_TX GPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //Multiplexage Push - Pull Output
GPIO_Init(GPIOA, &GPIO_InitStructure);//InitialisationGPIOA.9
//USART1_RX GPIOA.10Initialisation
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//Entrée flottante
GPIO_Init(GPIOA, &GPIO_InitStructure);//InitialisationGPIOA.10
USART_Init(USART1, &USART_InitStructure); //Initialisation du port série1
- Configurer le port série
USART_InitTypeDef USART_InitStructure;
//USART Paramètres d'initialisation
USART_InitStructure.USART_BaudRate = bound;//Taux de Baud du port série
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//La longueur du mot est8Format de données binaires
USART_InitStructure.USART_StopBits = USART_StopBits_1;//Un bit d'arrêt
USART_InitStructure.USART_Parity = USART_Parity_No;//Pas de parité
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//Pas de contrôle de flux de données matérielles
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //Mode de réception et de réception
- Configurer la priorité d'interruption
NVIC_InitTypeDef NVIC_InitStructure;
//Usart1 NVIC Configuration
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//Priorité de préemption3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //Sous - priorité3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQCanal activé
NVIC_Init(&NVIC_InitStructure); //Initialisation selon les paramètres spécifiésVICRegistres
- Activer l'interruption de réception
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//Ouverture du port série pour accepter l'interruption
- Le port série permet
USART_Cmd(USART1, ENABLE); //Activer le port série1
- Écrire une fonction de service d'interruption
void USART1_IRQHandler(void) //Port série1Interruption du programme de service
{
u8 Res;
#if SYSTEM_SUPPORT_OS //SiSYSTEM_SUPPORT_OSC'est vrai.,Besoin de soutienOS.
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //Réception interrompue(Les données reçues doivent être:0x0d 0x0aFin)
{
Res =USART_ReceiveData(USART1); //Lire les données reçues
if((USART_RX_STA&0x8000)==0)//Réception incomplète
{
if(USART_RX_STA&0x4000)//Reçu.0x0d
{
if(Res!=0x0a)USART_RX_STA=0;//Erreur de réception,Recommencer
else USART_RX_STA|=0x8000; //Réception terminée
}
else //Pas encore reçu0X0D
{
if(Res==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//Erreur de réception des données,Redémarrer la réception
}
}
}
}
#if SYSTEM_SUPPORT_OS //SiSYSTEM_SUPPORT_OSC'est vrai.,Besoin de soutienOS.
OSIntExit();
#endif
}
- Créer un 1 Une variable de taille octet Res, Pour stocker les données reçues .
- Il faut déterminer si une interruption de réception s'est produite , Si l'interruption est reçue, poursuivre la procédure de service d'interruption , Ne pas exécuter le programme de service d'interruption s'il s'agit d'une autre interruption .
- Déterminer si le BIT le plus élevé du drapeau d'état de réception est 1,Si oui1 Indique que la réception des données est terminée , Plus besoin de recevoir ,Si oui0 La réception des données n'est pas terminée , Besoin de continuer à recevoir .
- Jugement No.14Bit est1,- Oui.1 Cela signifie que les données précédentes sont 0X0D C'est le caractère de retour , Il faut alors décider si les données suivantes sont 0X0A C'est - à - dire les caractères de nouvelle ligne , Si ce n'est pas un caractère de nouvelle ligne , Ça veut dire que ces données ont été mal reçues , Besoin de re - recevoir , S'il s'agit d'un nouveau caractère de ligne, la réception des données est terminée , La position la plus élevée est requise 1.
- Jugement No.14- Oui.0Quand, Description les données sont toujours reçues , À la réception d'une donnée, il faut déterminer si elle est 0X0D C'est le caractère de retour , Et définir le BIT de drapeau correspondant .
- Quand ni les données précédentes ni celles - ci ne sont 0X0DQuand, Placer les données reçues dans un tableau ,L'indice du tableau est0À13 Nombre de données valides en bits .
Le processus de configuration de la fonction ci - dessus n'exige pas que nous écrivions une ligne de code, une ligne de code ,InST Fonctions de bibliothèque officiellement disponibles usart.c Il y a ces fonctions dans ,Nous pouvons l'utiliser directement.
- Écrire le programme principal
Le Code du programme principal doit être écrit par nous - mêmes
#include "delay.h"
#include "usart.h"
#include "led.h"
int main(void)
{
u8 len = 0;// Nombre de données stockées
u8 t = 0;//Variable de contrôle du cycle
LED_Init();//LED0Initialisation
delay_init();//Initialisation retardée
uart_init(115200);//Initialisation du port série,Taux de Baud115200
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// Les groupes de priorité utilisent le deuxième groupe
while(1)
{
// Envoyer lorsque la réception des données est terminée
if(USART_RX_STA&0x8000)
{
len = USART_RX_STA&0x3fff;//Obtenir la longueur des données
printf("\r\n Les données que vous envoyez sont :\r\n");
// Envoyer toutes les données
for(t = 0; t < len; t ++)
{
USART_SendData(USART1,USART_RX_BUF[t]);//Envoyer une donnée
while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET)
{
;// Une donnée n'a pas été envoyée avant d'attendre
}
}
printf("\r\n\r\n");
USART_RX_STA = 0;// Effacer le BIT d'état après l'envoi des données 0
}
// Attendre la réception des données lorsque la réception des données n'est pas terminée
else
{
printf("\r\nVeuillez saisir les données,Appuyez sur Entrée pour terminer:\r\n");
while((USART_RX_STA&0x8000)==0)
{
LED0 = !LED0;
delay_ms(500);//ledLes lumières clignotent,Attendre la saisie des données
}
}
}
}
C'est tout le Code de l'expérience de port série .
Affichage des effets

Sur l'assistant de débogage de port série , Envoyer après avoir entré le contenu , La fenêtre de réception affiche l'entrée .
Sans entrée,Sur le tableau de développementLED Les lumières clignotent , Il n'y aura pas de photos du tableau de développement ici .
Résumé
L'expérience porte principalement sur l'écriture du programme principal , Parce que toutes les autres fonctions d'initialisation sont ST Fonctions de bibliothèque officiellement disponibles , Si nous avons besoin d'utiliser d'autres ports série ou si nous avons d'autres exigences , Il suffit de modifier légèrement les fonctions de la Bibliothèque .
边栏推荐
- Unity Shader入门精要初级篇(一)-- 基础光照笔记
- Nanjing commercial housing sales enabled electronic contracts, and Junzi sign assisted in the online signing and filing of housing transactions
- 个人力扣题目分类记录
- Gson converts the entity class to JSON times declare multiple JSON fields named
- Panel display technology: LCD and OLED
- Implement custom memory allocator
- OpenGL 3D graphics rendering
- 模拟卷Leetcode【普通】1609. 奇偶树
- OpenGL frame buffer
- Tronapi wave field interface - source code without encryption - can be opened twice - interface document attached - package based on thinkphp5 - detailed guidance of the author - July 6, 2022 - Novice
猜你喜欢

Ppt template and material download website (pure dry goods, recommended Collection)

【istio简介、架构、组件】

Goldbach conjecture C language

NCS Chengdu New Electric interview Experience

数字三角形模型 AcWing 1027. 方格取数

Digital triangle model acwing 275 Pass a note
![[Yugong series] February 2022 U3D full stack class 005 unity engine view](/img/19/dc1b2f74b9ec5f5808de3049793862.jpg)
[Yugong series] February 2022 U3D full stack class 005 unity engine view

MySQL master-slave delay solution

Greenplum 6.x build_ Environment configuration

Markdown editor Use of MD plug-in
随机推荐
Output all composite numbers between 6 and 1000
模拟卷Leetcode【普通】1567. 乘积为正数的最长子数组长度
Platformization, a fulcrum of strong chain complementing chain
2022-07-06 Unity核心9——3D动画
How to add a mask of a target in a picture
2022-06-30 Unity核心8——模型导入
Selenium automation integration, eight years of testing experience, soft test engineer, an article to teach you
[Yugong series] February 2022 U3D full stack class 005 unity engine view
With an annual salary of 50W, Alibaba P8 will come out in person to teach you how to advance from testing
MySQL主从延迟的解决方案
NCS Chengdu New Electric interview Experience
使用Typora编辑markdown上传CSDN时图片大小调整麻烦问题
测试人一定要会的技能:selenium的三种等待方式解读,清晰明了
Recommended by Alibaba P8, the test coverage tool - Jacobo is very practical
Greenplum 6.x reinitialization
年薪50w阿裏P8親自下場,教你如何從測試進階
Three usage scenarios of annotation @configurationproperties
Category of IP address
[Yugong series] February 2022 U3D full stack class 006 unity toolbar
Markdown编辑器Editor.md插件的使用
