串口通信原理及应用

目录

一、定义

        应用场景:

        连接方式:

         帧格式:

二、代码编写

        初始化串口

        串口工具控制led灯亮灭

        主函数


一、定义

        串口通信是一种设备间非常常用的串行接口,以比特位的形式发送或接收数据,电子工程师经常使用这种方式来调试数据。

        应用场景:

                a:指纹锁(包括电容指纹和光学指纹)。

                b:手机无线传输模块,如WiFi模块、蓝牙模块、GPRS模块、4G模块、GPS模块、LoRa模块等。

                c:超级终端(SecureCRT、XSshell)。

        连接方式:

         帧格式:

 可以看到串口数据是低有效位优先传输(LSB)。

 通过这个示波器截取的图可以看到,起始位默认是低电平,以低有效位优先传输,连续发送0xA9(1010 1001),发送完成后停止位以高电平结束,总共加起来10个比特位传输。而校验位分为奇偶校验,奇校验主要看一个数据位有多少个1,如果1的总数为偶数,为了使整体1的个数为奇数,则效验位补1。偶校验也是一样看一个数据位有多少个1,如果1的总数为偶数,则补0

二、代码编写

        初始化串口

编程环境:keil5 STM32f407 

void usart1_init(uint32_t baud)
{
	
	//打开硬件时钟:GPIO端口硬件时钟、USART硬件时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	
	
	//配置GPIO引脚为复用功能模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;	//指定9、10号引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//配置为复用功能模式
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//速度越高,功耗就越高,但是响应速度也更快
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//不需要使能内部上下拉电阻
	GPIO_Init(GPIOA, &GPIO_InitStructure);	
	
	
	
	//将对应的GPIO引脚连接到串口
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
	
	
	//配置串口相关的参数:串口号,波特率,数据位,停止位,流控制
	USART_InitStructure.USART_BaudRate = baud;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	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);
	
	
	
	//配置串口相关的中断
	
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
	
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
	
	
	//使能串口工作
	USART_Cmd(USART1, ENABLE);

}

        串口工具控制led灯亮灭

void USART1_IRQHandler(void)
{
		
	uint8_t d;
	
	/* USART in Receiver mode */
	if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
	{
	  
		d = USART_ReceiveData(USART1);
		
		USART_SendData(USART1,d);
		
		if(d == 0x01)PFout(9)=0;
		if(d == 0xF1)PFout(9)=1;	
		
		if(d == 0x02)PFout(10)=0;
		if(d == 0xF2)PFout(10)=1;
		
		if(d == 0x03)PEout(13)=0;
		if(d == 0xF3)PEout(13)=1;
		
		if(d == 0x04)PEout(14)=0;
		if(d == 0xF4)PEout(14)=1;
	  
		USART_ClearITPendingBit(USART1,USART_IT_RXNE);
	}
	
	
}

        主函数

void usartl_send_art(char *str)
{
	char *p = str;
	
	while(*p!='\0')
	{
		USART_SendData(USART1,*p);
		
		while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
		
		USART_ClearFlag(USART1,USART_FLAG_TXE);
		
		p++;
	}

}

int main(void)
{

	/*2. 打开对应端口的硬件时钟,也就是对该硬件供电 */	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
	
	
	/*3. 初始化该端口 */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;	//指定9,10号引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//配置为推挽功能模式
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//速度越高,功耗就越高,但是响应速度也更快
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//不需要使能内部上下拉电阻
	GPIO_Init(GPIOF, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14;	//指定13、14号引脚
	GPIO_Init(GPIOE, &GPIO_InitStructure);
	
	
	//配置为中断优先级分组2,支持4级的中断抢占优先级、支持4级的中断子(响应)优先级
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	

	GPIO_WriteBit(GPIOF, GPIO_Pin_9|GPIO_Pin_10, Bit_SET);
	GPIO_WriteBit(GPIOE, GPIO_Pin_13|GPIO_Pin_14, Bit_SET);


	usart1_init(115200);
	
	usartl_send_art("hello world\t");
	
	while(1)
	{
		
	
		//delay_ms(1000);
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值