Lighting brightness control of serial communication usart
1, Communication principle
1. The communication interface mode between processor and external equipment is divided into serial communication and parallel communication
***Serial communication * * * refers to the transmission of each bit of data of the register to the receiving equipment in turn on a common data line;
***Parallel communication refers to the simultaneous transmission of each bit of data to the receiving end through multiple data lines.
2. In serial communication, according to the transmission direction of data, it is divided into simplex, half duplex and full duplex
Simplex data transmission only supports data transmission in one direction, as shown in figure (a);
Half duplex data transmission allows data to be transmitted in two directions, but at a certain time, data is only allowed to be transmitted in one direction. It is actually a simplex communication of switching directions, as shown in figure (b);
Full duplex data communication allows data to be transmitted in two directions at the same time. Therefore, full duplex communication is the combination of two simplex communication modes. It requires that both transmitting equipment and receiving equipment have independent receiving and transmitting capabilities, as shown in figure (c).
3. Synchronous transceiver and asynchronous transceiver
Synchronization means that when a process executes a request, if the request takes a period of time to return information, the process will wait until it receives the return information;
Asynchrony means that a process does not need to wait all the time, but continues to perform the following operations, regardless of the state of other processes. When a message returns, the system will notify the process to process it, which can improve the efficiency of execution.
4. Classification of common communication modes
Common serial communication modes:
2, Serial communication
1. Difference between USART and UART:
Click the link to view
Explanation from Baidu
Explanation from electronics enthusiasts
2. Serial communication wiring mode
TTL level and 232 level are introduced here
TTL level is the abbreviation of transistor transistor logic, which is the standard technology of communication between various parts of the equipment controlled by computer processor. TTL level signal is widely used because its data representation adopts binary specification, + 5V is equivalent to logic "1", and 0V is equivalent to logic "0".
In the digital circuit, the level of the circuit composed of TTL electronic components is a voltage range, which stipulates:
Output high level > = 2.4V, output low level < = 0.4V;
Input high level > = 2.0V, input low level < = 0.8V.
RS232 level is a standard of serial port; On TXD and RXD data lines:
Logic 1 is a voltage of - 3~-15V
Logic 0 is a voltage of 3~15V
Due to the different level logic, it needs to be converted. For example, I speak Chinese and you speak English, and CH340 is used as our direct translation. The following figure is CH340 chip. At the same time, USB-232 reception can be used to realize the communication between PC and ARM. Therefore, when we carry out serial communication, we should first consider whether to install CH340 driver.
The picture shows the development board of punctual atomic explorer
3. Principle block diagram of serial communication
4. Baud rate
In the field of electronic communication, Baud (modulation rate) refers to the rate at which the effective data signal modulates the carrier, that is, the number of carrier modulation state changes in unit time. [1]
Baud rate refers to the number of symbol symbols transmitted per second. It is a measure of symbol transmission rate. It is expressed by the number of carrier modulation state changes per unit time. 1 baud refers to the transmission of 1 symbol per second. Baud (unit symbol: Bd) is named after E mile Baudot (1845-1903), a French telecommunications engineer. He is one of the pioneers of digital communication and the inventor of telex and Baudot telegraph
5. Explanation of serial port program of library function version (serial port communication light control program)
Main program
//Main function #include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "beep.h" #include "pwm.h" int pow(int x,int y) { int i; int val=1; for(i=0;i<y;i++) { val = x*val; } return val; } int main(void) { int a=0; int n; u8 t=0; u8 len; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); delay_init(168); uart_init(115200); LED_Init(); BEEP_Init(); TIM14_PWM_Init(500-1,84-1); while(1) { while(USART_RX_STA&0x8000) { a=0; len=USART_RX_STA&0x3fff;//µÃµ½´Ë´Î½ÓÊÕµ½µÄÊý¾Ý³¤¶È for(t=0;t<len;t++) { if(USART_RX_BUF[t]<48||USART_RX_BUF[t]>57) { printf("\r\n The message you sent is:\r\n"); for(t=0;t<len;t++) { USART_SendData(USART1, USART_RX_BUF[t]); while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//µÈ´ý·¢ËͽáÊø } printf("\r\n Please enter 0-300 Integer between\r\n"); bibi(); USART_RX_STA=0; break; } } if(USART_RX_STA==0) { break; } printf("\r\n The message you sent is:\r\n"); n = len; a=0; for(t=0;t<len;t++) { n--; a= a + (USART_RX_BUF[t]-48)*pow(10,n); USART_SendData(USART1, USART_RX_BUF[t]); while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET); } if(a<0 || a>300) { printf("\r\n Please enter 0-300 Integer between\r\n"); bibi(); a=0; USART_RX_STA=0; break; } printf("\r\n The light intensity is%d\r\n",a); printf("\r\n\r\n");// USART_RX_STA=0; } TIM_SetCompare1(TIM14,a); // } }
usart code
#include "sys.h" #include "usart.h" #if SYSTEM_SUPPORT_OS #include "includes.h" #endif #if 1 #pragma import(__use_no_semihosting) //±ê×¼¿âÐèÒªµÄÖ§³Öº¯Êý struct __FILE { int handle; }; FILE __stdout; _sys_exit(int x) { x = x; } //ÖØ¶¨Òåfputcº¯Êý int fputc(int ch, FILE *f) { while((USART1->SR&0X40)==0); USART1->DR = (u8) ch; return ch; } #endif #if EN_USART1_RX u8 USART_RX_BUF[USART_REC_LEN]; u16 USART_RX_STA=0; void uart_init(u32 bound){ GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9ÓëGPIOA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸´Óù¦ÄÜ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //ËÙ¶È50MHz GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍ츴ÓÃÊä³ö GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //ÉÏÀ GPIO_Init(GPIOA,&GPIO_InitStructure); //³õʼ»¯PA9£¬PA10 //USART1 ³õʼ»¯ÉèÖà USART_InitStructure.USART_BaudRate = bound;//²¨ÌØÂÊÉèÖà USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ USART_InitStructure.USART_StopBits = USART_StopBits_1;//Ò»¸öֹͣλ USART_InitStructure.USART_Parity = USART_Parity_No;//ÎÞÆæÅ¼Ð£Ñéλ USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎÞÓ²¼þÊý¾ÝÁ÷¿ØÖÆ USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //ÊÕ·¢Ä£Ê½ USART_Init(USART1, &USART_InitStructure); //³õʼ»¯´®¿Ú1 USART_Cmd(USART1, ENABLE); //ʹÄÜ´®¿Ú1 //USART_ClearFlag(USART1, USART_FLAG_TC); #if EN_USART1_RX USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//¿ªÆôÏà¹ØÖÐ¶Ï //Usart1 NVIC ÅäÖà NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//´®¿Ú1ÖжÏͨµÀ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//ÇÀÕ¼ÓÅÏȼ¶3 NVIC_InitStructure.NVIC_IRQChannelSubPriority =1; //×ÓÓÅÏȼ¶3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀʹÄÜ NVIC_Init(&NVIC_InitStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷¡¢ #endif } void USART1_IRQHandler(void) //´®¿Ú1ÖжϷþÎñ³ÌÐò { u8 Res; #if SYSTEM_SUPPORT_OS //Èç¹ûSYSTEM_SUPPORT_OSÎªÕæ£¬ÔòÐèÒªÖ§³ÖOS. OSIntEnter(); #endif if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { Res =USART_ReceiveData(USART1);//(USART1->DR); //¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý if((USART_RX_STA&0x8000)==0)//½ÓÊÕδÍê³É { if(USART_RX_STA&0x4000)//½ÓÊÕµ½ÁË0x0d { if(Res!=0x0a)USART_RX_STA=0;//½ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼ else USART_RX_STA|=0x8000; //½ÓÊÕÍê³ÉÁË } else //»¹Ã»ÊÕµ½0X0D { 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; } } } } #if SYSTEM_SUPPORT_OS //Èç¹ûSYSTEM_SUPPORT_OSÎªÕæ£¬ÔòÐèÒªÖ§³ÖOS. OSIntExit(); #endif } #endif pwm code ```c #include "pwm.h" #include "led.h" #include "usart.h" void TIM14_PWM_Init(u32 arr,u32 psc) { //´Ë²¿·ÖÐèÊÖ¶¯ÐÞ¸ÄIO¿ÚÉèÖà GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //TIM14ʱÖÓʹÄÜ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //ʹÄÜPORTFʱÖÓ GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GPIOF9¸´ÓÃΪ¶¨Ê±Æ÷14 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //GPIOF9 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //¸´Óù¦ÄÜ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //ËÙ¶È100MHz GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍ츴ÓÃÊä³ö GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //ÉÏÀ GPIO_Init(GPIOF,&GPIO_InitStructure); //³õʼ»¯PF9 TIM_TimeBaseStructure.TIM_Prescaler=psc; //¶¨Ê±Æ÷·ÖƵ TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //ÏòÉϼÆÊýģʽ TIM_TimeBaseStructure.TIM_Period=arr; //×Ô¶¯ÖØ×°ÔØÖµ TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//³õʼ»¯¶¨Ê±Æ÷14 //³õʼ»¯TIM14 Channel1 PWMģʽ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±È½ÏÊä³öʹÄÜ TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OC1Init(TIM14, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPEʹÄÜ TIM_Cmd(TIM14, ENABLE); //ʹÄÜTIM14 }
6. Experimental phenomenon
Lamp brightness control of serial communication