精华内容
下载资源
问答
  • 串口通信-实验报告
    千次阅读
    2021-09-22 20:35:31

    STM32嵌入式接口与传感器应用开发》实验报告(

    实验名称: 串口通信  

    一、实验目的

    1.在keil5中编写工程以实现串口通信的功能。

    二、实验内容

    更多相关内容
  • 江苏科技大学计科专业,嵌入式实验实验代码和图片,详细过程。
  • 串口实验报告

    2015-06-07 14:17:20
    串口发送的51单片机实验程序代码,单片机发送,在电脑串行助手上接收并显示出来
  • 嵌入式STM32--实验四、串口通信实验

    千次阅读 多人点赞 2021-04-04 11:10:30
    1、 掌握STM32串口通信原理。 2、 学习编程实现STM32的UART通信。

    在这里插入图片描述

    ​ 自律 学习 坚强 ,拒绝迷茫。

    作者:行走的皮卡丘

    时间:2021/4/4

    喜欢就去追,这个红灯等不到,说不定下一个红灯等到了,嘻嘻!!!!!!!


    一、 实验目的

    • 1、 掌握STM32串口通信原理。

    • 2、 学习编程实现STM32的UART通信。

    二、 实验设备

    硬件

    ​ PC机 一台

    ​ STM32开发板 一套

    软件

    ​ MDK V4.0 一套

    ​ Windows 7 一套

    ​ 调试助手 一套

    三、 实验原理

    3.1、状态寄存器USART_SR及函数

    img

    第5、6位 RXNETC

    • RXNE(读数据寄存器非空),当该位被置1的时候,就是提示已经有数据被接收到了,并且可以读出来了。

    • TC(发送完成),当该位被置位的时候,表示USART_DR内的数据已经被发送完成了。

    在固件库函数里面,读取串口状态的函数是

    FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx,  uint16_t  USART_FLAG )

    这个函数的第二个入口参数非常关键,它是标示我们要查看串口的哪种状态,比如上面讲解的RXNE(读数据寄存器非空)以及TC(发送完成)。

    例如:要判断读寄存器是否非空(RXNE),操作库函数的方法是:

    USART_GetFlagStatus(USART1,USART_FLAG_RXNE);
    

    要判断发送是否完成(TC),操作库函数的方法是:

    USART_GetFlagStatus(USART1,USART_FLAG_TC);
    

    3.2、USATR1 发送一个字节

    /****************************************************************
    
    USATR1 发送一个字节
    
    功能:发送一个字节的数据
    
    入口参数:发送到数据
    
    出口参数:无
    
    *****************************************************************/
    void Send_OneByte(uint8_t onebyte)
    {
    	while(RESET == USART_GetFlagStatus(USART1, USART_FLAG_TC));//等待发送完毕
     		USART_SendData(USART1, onebyte);	
    }
    

    3.3、接收一个字节的数据

    /****************************************************************
    
    功能:接收一个字节的数据
    
    入口参数:无
    
    出口参数:返回收到的数据
    
    *****************************************************************/
    uint8 rxdata;//存储收到的数据
    
    uint8 Receive_OneByte(void)
    {
    	if(USART_GetITStatus(USART1, USART_IT_RXNE)!= RESET)//串口收到数据
    	{
            rxdata = USART_ReceiveData(USART1);
        }
    	return rxdata;
    }
    

    3.4、串口编程为如下步骤:

    //1) 串口时钟使能, GPIO 时钟使能
    //配置时钟,由于使用串口是在复用IO口,需要打开串口时钟和相应的IO口时钟。
    
    //2) GPIO 端口模式设置
    //串口相应的IO口需要配置,输出口配置成复用推挽输出,输出速度根据需要配置,输入口配置为悬空输入。
        
    //3) 串口参数初始化,使能串口。(***\*串口调试助手 与之一致\**** )
    
     USART_InitTypeDef   USART_InitStructure;  
     USART_InitStructure.USART_BaudRate = ***\*115200\****;  //波特率
     USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位  
     USART_InitStructure.USART_StopBits = USART_StopBits_1;  //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_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启接收中断。若无中断,该项不需要
     USART_Cmd(USART1, ENABLE);           //使能串口1 
    
    //4) 初始化 NVIC且开启中断(若开启中断才需要该步骤)
      NVIC_InitTypeDef   NVIC_InitStructure;  
      NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;  
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0)
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;
      //抢占优先级0,级别可自己设定 ,下面的子优先级可自定
    
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;    //子优先级2  
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
      //IRQ通道使能  
      NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器  
     //5) 编写中断处理函数 (有中断才需要该步骤)
    

    四、实验内容

    1、用STM32设计一个与计算机进行串口通讯的实验。STM32向PC发送 123ABC ,用串口调试助手 显示出来,用查询方式完成。

    2、用STM32设计一个与计算机进行串口通讯的实验。PC向STM32发送 456789 ,STM32接收后,将 每位数值+3 发送给PC,用 串口调试助手显示出来,用中断方式完成。

    3、用STM32设计一个与计算机进行串口通讯的实验,利用PC控制LED的亮灭。

    • 1)PC向STM32发送 A ,控制LED1,LED2,LED3同时亮灭,间隔时间0.5S,同时在 串口调试助手显示LED1,LED2,LED3同时亮灭”。

    • 2)PC向STM32发送 B ,控制LED1,LED2,LED3正向流水亮灭,间隔时间1S,同时在串口调试助手显示LED1,LED2,LED3正向流水亮灭”。

    • 3)PC向STM32发送 C ,控制LED1,LED2,LED3反向流水亮灭,间隔时间2S,同时在 串口调试助手显示LED1,LED2,LED3反向流水亮灭”。

    4、利用定时器结合串口实现 电子时钟的功能。功能如下:

    • 1)定时器完成 1S 的定时。

    • 2)串口调试助手*上显示时间,格式参考如下 12:34:56 ,每秒递增。串口调试助手每2秒刷新一次。

    ③在LCD上显示时间,格式参考如下 12:34:56 ,每秒递增。例程可参考 FSMC-液晶显示-英文的配套例程。

    4.1、用STM32设计一个与计算机进行串口通讯的实验。STM32向PC发送 123ABC,用串口调试助手显示出来,查询方式完成。(代码:实验4-1)

    img

    usart.c函数

    #include "sys.h"
    #include "usart.h"	  
     
    #pragma import(__use_no_semihosting)             
    //标准库需要的支持函数                 
    struct __FILE 
    { 
    	int handle; 
    
    }; 
    
    FILE __stdout;       
    //定义_sys_exit()以避免使用半主机模式    
    void _sys_exit(int x) 
    { 
    	x = x; 
    } 
    //重定义fputc函数 
    int fputc(int ch, FILE *f)
    {      
    	while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
        USART1->DR = (u8) ch;      
    	return ch;
    }
    
    //串口1中断服务程序
    //注意,读取USARTx->SR能避免莫名其妙的错误   	
    u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
    //接收状态
    //bit15,	接收完成标志
    //bit14,	接收到0x0d
    //bit13~0,	接收到的有效字节数目
    u16 USART_RX_STA=0;       //接收状态标记	  
      
    void uart_init(u32 bound){
      //GPIO端口设置
      GPIO_InitTypeDef GPIO_InitStructure;
    	USART_InitTypeDef USART_InitStructure;
    	NVIC_InitTypeDef NVIC_InitStructure;
    	 
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟
      
    	//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;	//复用推挽输出
      GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
       
      //USART1_RX	  GPIOA.10初始化
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
      GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  
    
      //Usart1 NVIC 配置
      NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
    	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
      
       //USART 初始化设置
    
    	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_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
      USART_Cmd(USART1, ENABLE);                    //使能串口1 
    
    }
    
    void USART1_IRQHandler(void)                	//串口1中断服务程序
    	{
    	u8 Res;
    	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
    		{
    		Res =USART_ReceiveData(USART1);	//读取接收到的数据
    		
    		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;//接收数据错误,重新开始接收	  
    					}		 
    				}
    			}   		 
         } 
    
    } 
    

    usart.h函数

    #ifndef __USART_H
    #define __USART_H
    #include "stdio.h"	
    #include "sys.h" 
    
    #define USART_REC_LEN  			200  	//定义最大接收字节数 200
    #define EN_USART1_RX 			1		//使能(1)/禁止(0)串口1接收
    	  	
    extern u8  USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符 
    extern u16 USART_RX_STA;         		//接收状态标记	
    //如果想串口中断接收,请不要注释以下宏定义
    void uart_init(u32 bound);
    
    #endif
    

    main函数

    #include "delay.h"
    #include "sys.h"
    #include "usart.h"
    
    /**************************************************
    * Function       main
    * @author        行走的皮卡丘
    * @date          2021/4/4
    * @brief        
    * @param[in]    
    * @param[out]    void
    * @retval        void
    * @par History   无
    * TXD PA.9
    * RXD PA.10
    *************************************************/
     int main(void)
     {		
     	u16 t;  
    	u8 data[10]="123ABC";
    	delay_init();	    	 //延时函数初始化	  
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    	uart_init(115200);	 //串口初始化为115200
     	while(1)
    	{	   
    		printf("\r\nSTM32发送的消息为:  ");
    		for(t=0;t<sizeof(data);t++)
    		{
    			USART_SendData(USART1, data[t]);//向串口1发送数据
    			while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
    		}
    		printf("\r\n");//插入换行
    		delay_ms(1000);
    	}	 
     }
    

    4.2、用STM32设计一个与计算机进行串口通讯的实验。PC向STM32发送 456789 ,STM32接收后,将 每位数值+3 发送给PC,用 串口调试助手 显示出来,用中断方式完成。(代码:实验4-2)

    img

    main函数

    #include "sys.h"
    #include "usart.h"
    /**************************************************
    * Function       main
    * @author        行走的皮卡丘
    * @date          2021/4/4
    * @brief        
    * @param[in]    
    * @param[out]    void
    * @retval        void
    * @par History   无
    * TXD PA.9
    * RXD PA.10
    *************************************************/
    
     int main(void)
     {		
    	char String[]="0123456789ABCDEFG";
     	u8  i;	 
      u8 data;
    	u16 len;
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    	uart_init(115200);	 //串口初始化为115200
     	while(1)
    	{
    		if(USART_RX_STA&0x8000)
    		{			
    			len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
    			USART_RX_BUF[len] = 0;
    			printf("\r\n PC发送的消息为:%s\r\n",USART_RX_BUF);
    			printf(" STM32发送的消息为:");
    			for(i = 0;i < len;i++)
    			{
    				data=String[ USART_RX_BUF[i] - 48 + 3 ];
    				printf("%c",data);
    			}
    			printf("\r\n");//插入换行
    			USART_RX_STA=0;
    		}
    	}	 
     }
    

    4.2.3、用STM32设计一个与计算机进行串口通讯的实验,利用PC控制LED的亮灭。(代码:实验4-3)

    1)PC向STM32发送 A ,控制LED1,LED2,LED3同时亮灭,间隔时间0.5S,同时在 串口调试助手显示LED1,LED2,LED3同时亮灭”。

    2)PC向STM32发送 B ,控制LED1,LED2,LED3正向流水亮灭,间隔时间1S,同时在 串口调试助手显示LED1,LED2,LED3正向流水亮灭”。

    3)PC向STM32发送 C ,控制LED1,LED2,LED3反向流水亮灭,间隔时间2S,同时在 串口调试助手显示LED1,LED2,LED3反向流水亮灭”。

    img

    #include "delay.h"
    #include "sys.h"
    #include "usart.h"
    
    
    /**************************************************
    * Function       main
    * @author        行走的皮卡丘
    * @date          2021/4/4
    * @brief        
    * @param[in]    
    * @param[out]    void
    * @retval        void
    * @par History   无
    * TXD PA.9
    * RXD PA.10
    *************************************************/
    
    #define LED1 PBout(0)
    #define LED2 PCout(4)
    #define LED3 PCout(3)
    
    void LED_Init(void)
    {
    	GPIO_InitTypeDef GPIO_InitStr;
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);//   
    	
    	
    	GPIO_InitStr.GPIO_Mode=GPIO_Mode_Out_PP;//推挽
    	GPIO_InitStr.GPIO_Pin=GPIO_Pin_0;
    	GPIO_InitStr.GPIO_Speed=GPIO_Speed_50MHz;
    	GPIO_Init(GPIOB,&GPIO_InitStr);  // PB0   LED1
    	
    	GPIO_InitStr.GPIO_Pin=GPIO_Pin_4;
    	GPIO_Init(GPIOC,&GPIO_InitStr);  // PC4   LED2
    	GPIO_InitStr.GPIO_Pin=GPIO_Pin_3;
    	GPIO_Init(GPIOC,&GPIO_InitStr);  // PC3   LED3
    
    	GPIO_SetBits(GPIOB,GPIO_Pin_0); 
    	GPIO_SetBits(GPIOC,GPIO_Pin_4); 
    	GPIO_SetBits(GPIOC,GPIO_Pin_3); 
    }
    
    
     int main(void)
     {		
     	u16 i=0;  
    	u16 len;	
    	u16 data;
    	 
    	LED_Init();			     //LED端口初始化
    	delay_init();	    	 //延时函数初始化	  
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    	uart_init(115200);	 //串口初始化为115200
     	
     	while(1)
    	{
    	    if(USART_RX_STA&0x8000)  //接收数据
    			{
    					len = USART_RX_STA&0x3f; 
    					for(i = 0;i < len; i++)
    					{
    						data = USART_RX_BUF[i];
    						while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);	
    					}
    					USART_RX_STA = 0;	
    					
    					if(data == 'A')
    					{
    							data = 0;
    							printf("LED1,LED2,LED3同时亮灭\r\n");
    							LED1=1; LED2=1; LED3=1;
    							while(USART_RX_STA==0)
    							{
    								LED1=~LED1; LED2=~LED2; LED3=~LED3;
    								delay_100ms(5);
    							}				
    					}
    					
    					if(data == 'B')
    					{
    							data = 0;
    							printf("LED1,LED2,LED3正向流水亮灭\r\n");
    							while(USART_RX_STA==0)
    							{
    								LED1=1; LED2=1; LED3=0;
    								delay_100ms(10);
    								LED1=1; LED2=0; LED3=1;
    								delay_100ms(10);				
    								LED1=0; LED2=1; LED3=1;
    								delay_100ms(10);				
    							}				
    					}
    					
    					if(data == 'C')
    					{
    							data = 0;
    							printf("LED1,LED2,LED3反向流水亮灭\r\n");
    							LED1=1; LED2=1; LED3=1;
    							while(USART_RX_STA==0)
    							{
    								LED1=0; LED2=1; LED3=1;
    								delay_100ms(20);
    								LED1=1; LED2=0; LED3=1;
    								delay_100ms(20);				
    								LED1=1; LED2=1; LED3=0;
    								delay_100ms(20);
    							}				
    					}				
    			}			
    	}	 
    }
    

    4.4、利用定时器结合串口实现 电子时钟的功能。(代码:实验4-4)

    • 定时器完成 1S 的定时。

    • 形参设置为arr=9999,psc=7199即可

    img

    • 串口调试助手上显示时间,格式参考如下 12:34:56 ,每秒递增。串口调试助手每2秒刷新一次。

    • 主函数中的死循环,其中flay在定时器2的中断中累加,即一秒以1累加。

    img

    • 在LCD上显示时间,格式参考如下 12:34:56,每秒递增。例程可参考FSMC-液晶显示-英文的配套例程。

    img

    main函数

    #include "led.h"
    #include "delay.h"
    #include "sys.h"
    #include "usart.h"
    #include "timer.h"
    #include "lcd.h" 
    
    /**************************************************
    * Function       main
    * @author        行走的皮卡丘
    * @date          2021/4/4
    * @brief        
    * @param[in]    
    * @param[out]    void
    * @retval        void
    * @par History   无
    * TXD PA.9
    * RXD PA.10
    *************************************************/
    
    
    
     int main(void)
     {		
    	ILI9341_Init();
    	ILI9341_GramScan( 6 );  //设置默认扫描方向,其中 6 模式为大部分液晶例程的默认显示方向  
    	LCD_SetColors(GBLUE,BLACK); 		//设置颜色
    	ILI9341_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH);
    	LCD_SetFont(&Font16x24);
    	LCD_SetTextColor(GREEN);   //设置文本颜色
    	 
    	delay_init();	    	 //延时函数初始化	  
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    	uart_init(115200);	 //串口初始化为115200
     	LED_Init();			     //LED端口初始化
    	TIM2_Int_Init(9999,7199); //一秒一次中断  72 000 000 /7200=10000  10000/10000=1hz 1/1hz=1s
    	 
     	while(1)
    	{
    		if( flay==2 )
    		{
    			flay = 0;
    		  printf("%s\r\n",TimeStr);
    		}
    		
    	}	 
     }
    

    五、实验总结

    加油!!!行走的皮卡丘!!!!

    实验四代码下载链接

    展开全文
  • 湖南科技大学嵌入式报告: 1、数码管动态显示 2、串口通信 3、按键中断 4、定时器 5、ADC模数转换
  • 嵌入式系统 实验串口通信实验

    千次阅读 2021-12-28 22:53:48
    实验串口通信实验 一、实验目的 1.)了解 USART 的基本特性; 2.)掌握用库函数操作 USART 的方法; 3.)掌握如何使用 STM32 的串口发送和接收数据。 二、实验环境 1.)硬件:1 个空气温湿度传感器模块、1 个 ST-...

    实验二 串口通信实验

    一、实验目的

    1.)了解 USART 的基本特性;
    2.)掌握用库函数操作 USART 的方法;
    3.)掌握如何使用 STM32 的串口发送和接收数据。

    二、实验环境

    1.)硬件:1 个空气温湿度传感器模块、1 个 ST-Link 调试器、1 根 USB2.0 方口线、1
    根 USB3.0 数据线、1 台 PC 机;
    2.)软件:Windows 7/XP、MDK 集成开发环境。
    系统上电、复位提示信息
    3)、 在发送区输入“/物联网感知与控制技术—2.2 串口通信实验 DEMO/”,点
    击按钮 ,通过串口以及 ST-Link 调试器,将数据发送到温湿度传感器模块。
    4)、 由 3.3.4 知,温湿度传感器模块接收到数据后会返回相同的数据,这时,接收区会
    接收到同样的数据,如下图所示。
    在这里插入图片描述

    四、实验步骤

    1)、将 USB3.0 数据线的一端连接感知执行模块的 USB3.0 调试烧写口,另一端连接
    ST-Link 调试器的“Debug”接口。
    2)、 将第 1 根 USB2.0 方口线的一端连接 PC 机的 USB 口,另一端连接 ST-Link 调试器的“USB-Debug”接口。
    3)、将第 2 根 USB2.0 方口线的一端连接 PC 机的 USB 口,另一端连接 ST-Link 调试器的“USB-232”接口。
    4)、双击打开【配套光盘\03-常用工具\01-硬件开发包\09-串口调试工具】目录下的串口
    调试器,选择正确的端口号(可参照 1.2.2 查看串口端号),波特率设为 115200,其他均保
    持默认设置,点击按钮“打开串口”即可,效果见下图。
    串口调试器配置
    5)、双击打开工程文件“STM32-USART.uvproj”。
    6)、在工具栏中点击按钮,编译工程,编译成功后,信息框会出现下图所示的信息。如
    果编译失败,请参照 1.2.1.2 中的内容,确认相关选项是否配置正确。
    在这里插入图片描述
    7)、参照 1.2.1.3 中的内容,确认与硬件调试有关的选项已设置正确。
    8)、 点击按钮“LAOD”,将程序下载到温湿度传感器模块中。下载成功后,信息框显示下图中所示的信息,表明程序下载成功并已自动运行。

    在这里插入图片描述
    9)、 程序运行起来后,User1 指示灯被点亮,观察串口调试器接收区接收到的数据。
    10)、 按一下温湿度传感器模块的复位按钮,再观察串口调试器接收区接收到的数据。
    11)、 在发送区输入一些数字、字母、字符、汉字等内容,点击按钮“发送”发送到串口,
    观察串口调试器接收区接收到的数据。

    五、实验程序

    #include "stm32f10x.h"  
    #include <stdio.h>  
    void gpio_init(void) // GPIO 的初始化配置  
    {  
    GPIO_InitTypeDef GPIO_InitStructure; // 定义一个 GPIO 初始化类型结构体  
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |  
    RCC_APB2Periph_GPIOA , ENABLE); // 开启 GPIOB 和 GPIOA 的外设时钟  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; // 选择要控制的 GPIOB 引脚  
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置引脚速率为 50MHz  
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 设置引脚模式为通用推挽输出  
    	GPIO_Init(GPIOB, &GPIO_InitStructure); // 调用库函数,初始化 GPIOB  
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // 选择要控制的 GPIOA 引脚  
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 用作串口输出  
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
    	GPIO_Init(GPIOA, &GPIO_InitStructure);   
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;  
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;// 用作串口输入  
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
    	GPIO_Init(GPIOA, &GPIO_InitStructure);   
    	}  
    	void led_init(void) // 点亮 User1 指示灯  
    	{  
    	GPIO_ResetBits(GPIOB,GPIO_Pin_7);  
    	}  
    	void USART1_Config(void)  
    	{  
    	USART_InitTypeDef USART_InitStructure; // 定义 USART 初始化类型结构体  
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE); // 开启 USART1 时钟  
    	USART_InitStructure.USART_BaudRate = 115200; // 波特率设为 115200  
    	USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 1 个起始位,8 个数据位  
    	USART_InitStructure.USART_StopBits = USART_StopBits_1; // 1 个停止位  
    	USART_InitStructure.USART_Parity = USART_Parity_No ; // 无奇偶校验  
    	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  
    	// 失能 CTS    无硬件控制流  
    	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 使能发送和接收  
    	USART_Init(USART1, &USART_InitStructure); // 调用库函数,初始化 USART1  
    	USART_Cmd(USART1, ENABLE); // 使能 USART1  
    	}  
    	int fputc(int ch, FILE *f) // 
    	{  
    	USART_SendData(USART1, (char) ch);  
    	// 将 printf()中的内容发往串口  
    	while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)  
    	// 发送数据寄存器非空时,循环等待  
    	{  
    	}  
    	return (int)ch; // 返回值  
    	}  
    	int main(void)  
    	{  
    	char data='0'; // 保存接收到的数据   
    	gpio_init(); // GPIO 初始化  
    	led_init(); // LED 初始化  
    	USART1_Config(); // 配置 USART1  
    	printf(" Please input a char \r\n"); // 开机后提示输入字符串  
    		
    	while(1)  
    	{  
    	if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == SET)  
    	 {  
    	data=USART_ReceiveData(USART1); // 读取 USART1 接收到的数据到 data 中  
    	USART_SendData(USART1 ,data); // 向串口发送接收到的数据  	
    	 }  
    	}  
    	}  	
    

    六、实验结果

    在这里插入图片描述
    在这里插入图片描述

    七、实验心得

    因为和上次实验用的接口不一样,实验之前要仔细检查到底是COM几。在判断是否已经发送完成时,对比使用了USART_FLAG_TC和USART_FLAG_TXE两个函数。在引脚的选择方面查阅了关于复用的参数。
    在这里插入图片描述

    展开全文
  • 嵌入式LED实验报告

    2013-07-03 16:45:55
    嵌入式应用开发的指导,Embest S3CEV40开发板是实验系统的主要硬件平台,它是英蓓特公司开发的一款全功能ARM开发板,基Samsung公司的S3C44B0X处理器(ARM7TDMI),资源丰富。硬件系统包含了嵌入式系统开发应用所需的...
  • 嵌 入 式 程 序 设 计实 验 报 告成评 语: 绩 教 师: 年 月 日班 级: 学 号: 姓 名: 地 点: EII-506 时 间: 2013年6月实验一开发环境的搭建与配置一、 【实验目的】1)...

    嵌 入 式 程 序 设 计

    实 验 报 告

    成评 语: 绩 教 师: 年 月 日

    班 级: 学 号: 姓 名: 地 点: EII-506 时 间: 2013年6月

    实验一开发环境的搭建与配置

    一、 【实验目的】

    1) 熟悉嵌入式Linux开发平台。

    2) 掌握嵌入式Linux开发平台的开发环境搭建与配置。 3) 了解minicom配置串口通信参数的过程。 4) 了解嵌入式Linux的启动过程。

    5) 掌握程序交叉编译运行及调试的一般方法。 6) 掌握网络文件系统NFS的配置方法。

    7) 掌握嵌入式系统内核的编译、文件系统的打包及镜像的下载方法。

    二、 【实验内容】

    1) 连接实验开发板与宿主机。

    2) 在虚拟机中的CentOS(宿主机)搭建开发环境。 3) 在宿主机中配置minicom。 4) 分析嵌入式Linux的启动过程。

    5) 在宿主机上编写简单的C语言程序并用交叉编译工具进行编译,然后传

    输到目标机上运行。

    6) 在宿主机上编写简单的C语言程序并用交叉编译工具进行编译,用

    gdbserver进行远程调试。

    7) 配置NFS并用NFS进行文件拷贝。 8) 嵌入式系统内核编译与文件系统的打包。

    9) 内核文件镜像与文件系统镜像的下载(从宿主机下载到目标机)。

    三、 【实验步骤】

    1. 连接实验开发板,对虚拟机进行设置 2. 工具链的配置 3. tftp的安装

    4. 进入minicom软件,配置串口通信参数 有关串口通信选项的含义:

    \:选择需要传输的文件和路径 \:选择传输文件的通信协议 \:设置串口通信参数

    \:将设置好的各项参数保存为dfl

    \:将设置好的各项参数保存为自定义的文件名 \:退出返回到minicom设置好后的终端

    \:从minicom命令中退出返回Linux终端

    将光标移到\,按回车键会弹出串口通信参数的配置菜单。 5. 实验开发板的启动

    6. 嵌入式Linux系统的启动过程分析 1) 启动Bootloader

    Bootloader是嵌入式系统的引导加载程序,它是系统上电后运行的第一段程序,其作用类似于PC机上的BIOS。在本系统中这段程序的起始地址为0x00000000。Bootloader在完成初始化RAM、初始化串口、检测处理器类型、设置Linux启动参数后,开始调用Linux内核。本系统Linux内核镜像zImage放在Flash中,Bootloader首先把它拷贝到RAM中,然后跳转到RAM中对zImage进行解压缩。解压缩后启动内核。

    2) 加载内核

    内核启动后先进行一系列与内核相关的初始化,然后调用第一个用户进程——init进程并等待用户进程的执行。具体的过程如下:

    进行与体系结构相关的第一个初始化工作,首先通过检测出来的处理器类型进行处理器内核的初始化,然后进行内存结构的初始化,最后开启MMU,创建内核页表,映射所有的物理内存和IO空间;

    创建异常向量表和初始化中断处理函数;

    初始化系统核心进程调度器和时钟中断处理机制;

    初始化串口控制台,在minicom中看到的系统启动过程中的信息都是通过串口输出的;

    创建和初始化系统cache,为各种内存调用机制提供缓存,包括动态内存分配、虚拟文件系统及页缓存;

    初始化内存管理,检测内存大小及被内核占用的内存情况; 初始化系统的进程间通信机制(IPC); 创建init进程,结束内核的启动。 3) 执行init进程。

    内核被加载后,第一个运行的程序便是/sbin/init,init进程是所有进程的发起者和控制者,它的进程号是1。init进程首先读取/etc/inittab文件,并依据此文件来进行初始化工作(首先进行一系列的硬件初始化,然后通过命令行传递过来的参数挂载根文件系统。最后执行一些其它的进程)。

    init配置文件每行的基本格式为“id:runlevel_ignored:action:process”,其中某些部分可以为空。各部分的具体内容如下:

    id:指定启动进程的控制终端,如果所启动的进程并不是可以交互的shell,应该会有个控制终端(在PC机上该字段表示配置行的惟一标识)。

    runlevel_ignored:该字段是忽略掉的,配置inittab时空着它就行了(在PC机上该字段用来配置所启动进程适用的系统运行级别)。

    4) 执行/bin/login程序。

    展开全文
  • 嵌入式第9次实验报告

    千次阅读 2020-12-20 14:38:36
    学号:140201218 姓名:杨昌航组别:第7组 实验地点:D19一、实验目的:1.熟悉WWW技术中的SSI(Server Side Include)技术。2.学会使用SSI技术编写代码把当前开发板内RTC的时钟及日期数据送往PC机浏览器显示。3.学会...
  • ARM嵌入式跑马灯设计实验报告.docARM嵌入式设计实验报告题目: 跑马灯的设计专 业:班 级:姓 名:学 号:指导教师:2014年11 月目 录1 题目要求…………………………………………………………………12 设计软件的安装...
  • 串口通信实验报告 含代码 串口通信实验报告 含代码 串口通信实验报告 含代码 串口通信实验报告 含代码 串口通信实验报告 含代码
  • 嵌入式ARM键盘控制LED灯实验报告

    千次阅读 2021-01-12 22:49:13
    2实验设备(1)S3C2410嵌入式开发板,JTAG仿真器。(2)软件:PC机操作系统WindowsXP,ADS1.2集成开发环境,仿真器驱动程序,超级终端通讯程序。3实验内容编写中断处理程序,处理一个键盘中断,并在串口打印中断及按键...
  • 嵌入式Linux实验报告嵌 入 式 程 序 设 计实 验 报 告评 语:成绩教 师:年 月 日班 级:学 号:姓 名:地 点: EII-506时 间: 2013年6月实验一开发环境的搭建与配置【实验目的】熟悉嵌入式Linux开发平台。...
  • 嵌入式系统实验报告(C 语言实验)

    万次阅读 2018-06-27 00:27:12
    第一部分指导手册实验分析1 LED 流水灯这是我们学习C 语言实验的第一个示例,项目的烧录、执行与汇编相同,这里我们简要分析一下我们的项目。首先我们从main 函数开始,它有两个函数,do_system_initial 和led_...
  • 实验一linux基本操作实验的实验报告一实验目的1、熟悉嵌入式开发平台部件,了解宿主机/目标机开发模式;2、熟悉和掌握常用Linux的命令和工具。二实验步骤1、连接主机和目标板;(三根线,网线直接连接实验箱和PC机,...
  • 嵌入式实验报告总结一

    千次阅读 2018-11-21 09:56:38
    实验一:LED发光二极管实验 一、实验环境 硬件:通用节点一个、USB仿真器、PC机; 软件:IAR Embedded Workbench for MCS-51; 二、实验内容 熟悉Zigbee硬件模块相关接口; 使用IAR 开发环境设计程序,...
  • 嵌入式系统与开发》构建嵌入式Linux系统-实验报告嵌入式数据库sqlite移植及使用》实验报告 学生姓名: 陈 彤 学 号: 1座机电话号码 专业班级: 130044 指导教师: 孙国梓 完成时间: 2016.5.31 实验3 嵌入式...
  • 本资源为单片机串口和键盘接口应用的实验报告,对应的博客已经发出,报告中的内容大部分都在博客中有所体现,但是如果有小伙伴需要报告的话也可以下载哦。 整理不易,还望多多点赞支持哦~
  • 嵌入式系统stm32-USART串口通信实验

    千次阅读 2021-03-10 20:35:43
    用两块STM32的USART1进行数据的传输,并将按键次数在数码管上显示 (后面将接收数据的STM32称为U1/RX,将发送数据的STM32称为U2/TX) 。...软件编程(该实验需要为U1/RX和U2/TX分别编写程序)  U1/RX(数据接收端
  • 嵌入式串口和网络编程实验报告.doc
  • 《ARM嵌入式系统与应用实验报告》由会员分享,可在线阅读,更多相关《ARM嵌入式系统与应用实验报告(26页珍藏版)》请在人人文库网上搜索。1、信息科学与技术系ARM嵌入式系统与应用实验报告专业班级 ____电信0803班___...
  • 串口助手接受到的十六进制序列按照一定的字节数转换为(float ,u16 ,signed 16),注意float的存储格式
  • 嵌入式定实时时钟实验报告综合性设计性实验报告课程名称: 嵌入式系统原理开设时间: 2009学年第二学期专业班级: 07软件工程(1)班指导教师: 殷建军提交时间: 2010年6月4日综合性设计性实验成绩单学号200730690118...
  • led闪烁实验报告.doc

    千次阅读 2020-12-21 07:10:04
    led闪烁实验报告篇一:单片机实验--LED灯闪烁实验实 验 报 告课程名称实验项目2016年 3 月 13 日实验目的1. 掌握51单片机开发板的使用步骤;2. 掌握51单片机开发板所需软件的安装过程;3. 以LED灯闪烁为例子,掌握...
  • 嵌入式系统uClinux试验报告本 科 实 验 报 告实验名称:inux 操作系统定制、移植和加载实验实验目的和要求掌握内核交叉编译环境的建立和使用;掌握μClinux内核的配置和裁剪;了解μClinux的启动过程。实验内容和...
  • 实验题目:并行接口输出型API函数运用 实验时间:2022.2.21(第1周周一)~2022.3.4(第2周周五) 实验地点:在规定时间中自主寻找合适实验地点并在规定时间内完成 实验条件: 1.STC-B学习板(2021暑假小学期每个...
  • ARM嵌入式跑马灯设计实验报告.docARM嵌入式设计实验报告题目: 跑马灯的设计专 业:班 级:姓 名:学 号:指导教师:2014年11 月目 录1 题目要求…………………………………………………………………12 设计软件的安装...
  • 嵌入式实验报告

    2018-11-21 15:29:29
    实验报告 一、 小组成员 江剑豪 孙玉祥 张峻玮 二、 实验内容 1.LED发光二极管实验; 2.串口收发数据实验; 3.按键控制实验; 三、 实验环境 硬件:通用节点或任意传感器节点一个、USB仿真器、USB电缆、PC机; ...
  • 嵌入式实验四实验报告 3.4基于UART勺加法器的实现 一 实验目的 学习 lm3s9b92 的串口通信 学习应用超级终端调试串口 学会应用UART有关的库函数 二 实验设备 计算机LM3S9B92开发板USB A型公口转 Mini B 型 5Pin 数据...
  • RTC 器件与微控制器之间的接口大都采用连线简单的串行接口,诸如I2C、SPI、MICROWIR和ECAN 等串行总线接口。这些串口由 2~3 根线连接,分为同步和异步。     2. S3C44B0X 实时时钟( RTC )单元 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,785
精华内容 714
关键字:

串口实验报告嵌入式

友情链接: cad.zip