当前位置:网站首页>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 .
边栏推荐
- Panel display technology: LCD and OLED
- LeetCode 715. Range module
- Un salaire annuel de 50 W Ali P8 vous montrera comment passer du test
- ncs成都新電面試經驗
- Simulation volume leetcode [general] 1705 The maximum number of apples to eat
- How to add a mask of a target in a picture
- Data analysis methodology and previous experience summary 2 [notes dry goods]
- Greenplum6.x搭建_安装
- Digital triangle model acwing 1027 Grid access
- 硬件大熊原创合集(2022/06更新)
猜你喜欢
NCS Chengdu Xindian interview experience
Recommended by Alibaba P8, the test coverage tool - Jacobo is very practical
leetcode134. gas station
ncs成都新电面试经验
数字三角形模型 AcWing 275. 传纸条
2022-07-06 Unity核心9——3D动画
Nanjing commercial housing sales enabled electronic contracts, and Junzi sign assisted in the online signing and filing of housing transactions
Why choose cloud native database
Lenovo hybrid cloud Lenovo xcloud: 4 major product lines +it service portal
STM32串口寄存器库函数配置方法
随机推荐
leetcode134. gas station
Test pits - what test points should be paid attention to when adding fields to existing interfaces (or database tables)?
Common operating commands of Linux
On December 8th, 2020, the memory of marketing MRC application suddenly increased, resulting in system oom
Opencv converts 16 bit image data to 8 bits and 8 to 16
channel. Detailed explanation of queuedeclare parameters
The longest ascending subsequence model acwing 1017 Strange thief Kidd's glider
Simple use of Xray
面试题:高速PCB一般布局、布线原则
Digital triangle model acwing 275 Pass a note
Greenplum6.x-版本变化记录-常用手册
阿里p8手把手教你,自动化测试应该如何实现多线程?赶紧码住
为不同类型设备构建应用的三大更新 | 2022 I/O 重点回顾
OpenGL 3D graphics rendering
【istio简介、架构、组件】
STM32串口寄存器库函数配置方法
Vagrant failed to mount directory mount: unknown filesystem type 'vboxsf'
Interpretation of MySQL optimization principle
Sign and authenticate API interface or H5 interface
ChaosBlade:混沌工程简介(一)