当前位置:网站首页>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 .
边栏推荐
- Port occupation troubleshooting
- 指针进阶,字符串函数
- Output a spiral matrix C language
- [step on the pit] Nacos registration has been connected to localhost:8848, no available server
- 硬件大熊原创合集(2022/05更新)
- Analysis of Hessian serialization principle
- LED模拟与数字调光
- QT charts use (rewrite qchartview to realize some custom functions)
- C语言指针(习题篇)
- GoLand set goproxy
猜你喜欢
JS operation
Greenplum 6.x reinitialization
硬核分享:硬件工程师常用工具包
Unityshader introduction essentials personal summary -- Basic chapter (I)
【Istio Network CRD VirtualService、Envoyfilter】
STM32串口寄存器库函数配置方法
The longest ascending subsequence model acwing 1017 Strange thief Kidd's glider
Goldbach conjecture C language
Greenplum 6.x common statements
Greenplum6.x搭建_环境配置
随机推荐
Several methods of calculating the average value of two numbers
OpenGL 3D graphics rendering
使用Typora编辑markdown上传CSDN时图片大小调整麻烦问题
年薪50w阿里P8亲自下场,教你如何从测试进阶
Calf problem
实现自定义内存分配器
平台化,强链补链的一个支点
H3C VXLAN配置
[Yugong series] February 2022 U3D full stack class 008 - build a galaxy scene
【Istio Network CRD VirtualService、Envoyfilter】
Selenium automation integration, eight years of testing experience, soft test engineer, an article to teach you
Greenplum6.x搭建_环境配置
阿里p8手把手教你,自动化测试应该如何实现多线程?赶紧码住
为不同类型设备构建应用的三大更新 | 2022 I/O 重点回顾
Cmake command line use
求有符号数的原码、反码和补码【C语言】
ESP32-ULP协处理器低功耗模式RTC GPIO中断唤醒
Enterprise manager cannot connect to the database instance
MySQL master-slave delay solution
面板显示技术:LCD与OLED