完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
通信基础知识
我们常见的单片机常见的通讯方式有:UART、IIC、SPI等等。按照其特点可以做一下分类。(个人理解的方式、若要深究并不一定与其完全一致。) 1、工作方式 单工:只能单向传递信息。如接受端就只能接收,不能发送。 半双工:**可以双向通信,当是不能同时双向通信。**即同一时刻,一段只能接收或者发送。IIC 全双工:可以实现同时双向的通信。UART、ISP 2、通讯方式 串行通信:把一组数据拆分为一位一位的传递,所使用的引脚的数量少、速度慢。(USRT、IIC等) **并行通信:**一次性发送一组数据,需要的引脚数量多,速度快。 3、内部时钟 **同步方式:**带有时钟 IIC、SPI **异步方式:**不带时钟 UART 则可以知道UART属于串行通信的异步全双工模式 STM32的UART 1、UART基础知识 stm10系列的串口引脚和配置图如下 经常使用的函数 1、USART_Init() 初始化串口 2、USART_ReceiveData() 读取数据函数 3、USART_SendData() 发送数据函数 。。。。还有很多暂时知道这么多 函数入口参数可以 goto 其定义查看 2、操作步骤 3、实例代码 void USB_Init(void) { GPIO_InitTypeDef GPIO_InitStrue; //声明GPIO结构体 USART_InitTypeDef USART_InitStrue; //声明串口结构体 NVIC_InitTypeDef NVIC_InitStrue; //声明中断结构体 NVIC_InitStrue这部分是自己命名 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //GPIO时钟的使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //串口1的时钟使能 GPIO_InitStrue.GPIO_Mode = GPIO_Mode_AF_PP; //设置为复用推挽 GPIO_InitStrue.GPIO_Pin = GPIO_Pin_9; //9号IO口 GPIO_InitStrue.GPIO_Speed = GPIO_Speed_10MHz; //输出速率 GPIO_Init(GPIOA,&GPIO_InitStrue); //TX9的配置状态 GPIO_InitStrue.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入 GPIO_InitStrue.GPIO_Pin = GPIO_Pin_10; //10号IO GPIO_InitStrue.GPIO_Speed = GPIO_Speed_10MHz; //输出速率 GPIO_Init(GPIOA,&GPIO_InitStrue); //RX10的配置 USART_InitStrue.USART_BaudRate = 115200; //波特率设置为115200 USART_InitStrue.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 无硬件数据流控制 USART_InitStrue.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; //收发模式都使能 USART_InitStrue.USART_Parity = USART_Parity_No; //无奇偶校验位 USART_InitStrue.USART_StopBits = USART_StopBits_1; //一个停止位 USART_InitStrue.USART_WordLength = USART_WordLength_8b; //字长为8 USART_Init(USART1,&USART_InitStrue); //调用其Init函数 USART_Cmd(USART1,ENABLE ); //中断使能,确定端口, USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //中断模式。这里是接受中断,其他中断模式查阅其定义和参考手册 NVIC_InitStrue.NVIC_IRQChannel = USART1_IRQn; //指出通道 ,这里是串口一的通道 NVIC_InitStrue.NVIC_IRQChannelCmd = ENABLE; //开启中断通道 NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority = 1; //设置抢占优先级,注意选择的模式,即抢占优先级最大位 NVIC_InitStrue.NVIC_IRQChannelSubPriority = 1; //子优先级 NVIC_Init(&NVIC_InitStrue); //调用NVIC_INIT函数,将我们定义的结构体地址作为入口参数 } void USART1_IRQHandler(void) **//只能使用这个函数名,具体查看STM32踩坑笔记**: { u8 data; //定义变量存储读取到的数据 if(USART_GetFlagStatus(USART1,USART_IT_RXNE)) //判断中断是不是我们之前设置的中断,如果是值为1 { data = USART_ReceiveData(USART1); //读取串口函数,并将其赋值 USART_SendData(USART1,data); //将读取到的数据发送出去 } 主函数 int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //在中断函数前就要调用 //2号分组,两位抢占优先级,两位响应优先级,其他具体分组查看参考手册 USB_Init(); while(1); } 其他中断服务函数入口参数(如GPIO的中断服务函数),参考以下文件 代码讲解:改代码实现的作用是使用串口与电脑通信,当电脑向发版发送数据就进入中断,让开发板将收到的数据发送回电脑。 敲黑板:1、对其GPIO使能后还需要对其串口使能,即需要使能两次。 2、中断部分,如果没有中断需要就可以不做配置 4、稀碎寄存器知识 1、u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节. //接收状态 //bit15, 接收完成标志 //bit14, 接收到0x0d //bit13~0, 接收到的有效字节数目 u16 USART_RX_STA=0; //接收状态标记 在程序末尾必须手动置0 这里可以参考大佬文章:https://blog.csdn.net/JackCrum/article/details/99864683 可以通过USART_RX_BUF来按位读取接收到的字符 eg: s=USART_RX_BUF[0]-‘0’; 末尾减去这个’0‘的用法我还没摸透。百度好多也没有。 个人使用总结如下: 当串口返回值需要提取后再发送到电脑时。若要保证数据正常,正常必须去掉-’0‘ 当该值是需要取出来做其他操作:数值运算就必须带上-’0‘,字符比较时就要去掉。 2、len=USART_RX_STA&0x3fff; //得到此次接收到的数据长度 3、USART_GetFlagStatus(USART1,USART_FLAG_TC) TC中断,用于判断寄存器数据是否发送完毕。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1602 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1536 浏览 1 评论
967 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
680 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1579 浏览 2 评论
1860浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
640浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
513浏览 3评论
527浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
500浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 10:21 , Processed in 0.652393 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号