STM32调试SP3485技术总结

发布者:轻松自在最新更新时间:2023-07-03 来源: elecfans关键字:STM32  调试  SP3485 手机看文章 扫描二维码
随时随地手机看文章

1、本文使用的STM32芯片是STM32F103RB,使用的资源是片内的USART1。

2、下面是我的电路连接图:

STM32调试sp3485技术总结

注:电路可以稍做修改更好,在B和A分别接下拉电阻到地和上拉电阻到5v,阻值选择为10K即可,这是为了在没有进行数据传输时保证两条数据线的状态为确定值。

做一下简单的说明:

(1)PA8是sp3485的发送/接收使能端,sp3485只能支持半双工的通信,所以这个引脚就是来控制这个芯片到底是收数据还是发数据的。

(2)在有些电路连接中,sp3485的A和B端会一个被连接一个上拉电阻到3.3V,另一个会连接一个下拉电阻到GND,这样做的目的是当本sp3485不参与通信时不会影响网络的稳定性。


3、本次调试方式

PC机——USB转232转换头——RS232/RS485双向转换头——sp3485——STM32,因为是第一次调试sp3485芯片,所以当然没有太大意,先拿电脑调试,调试通了再看板子和板子之间的通信了。


4、本次试验的代码:

main函数:

int main(void)

{

/* Configure the system clocks */

RCC_Configuration();

/* NVIC Configuration */

NVIC_Configuration();

/* Configure the GPIOs */

GPIO_Configuration();

/* Configure the USART1 */

USART_Configuration();

GPIO_SetBits(GPIOA, GPIO_Pin_8); //PA8是sp3485发送/接收控制端,这里先设置为发送(实现的功能就是上电之后STM32先向PC发送一个4和一个3)

delay_ms(2);//稍稍延时一下,原因去查看sp3485的手册吧

USART_ClearFlag(USART1,USART_FLAG_TC);//这一句很关键,如果没有这一句这个4会发送不成功或者发送错误的,

//其实手册上讲了使能发送位后会发送一个无用的帧,所以那个帧发送完了这个

//发送完成的标志位USART_FLAG_TC当然也被置位了。

USART_SendData(USART1, 4);

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);//上面清除了发送完成标志位,那么这里就可以等待发送完成标志位被置位来判断这一帧是否发完了

USART_SendData(USART1, 3);

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);

while(1)

{

GPIO_ResetBits(GPIOA, GPIO_Pin_8);//现在把PA8清零,试试接收PC机发送过来的数据

delay_ms(2);//稍稍延时一下,原因去查看sp3485的手册吧

USART_ClearFlag(USART1,USART_FLAG_RXNE);//既然上面开始发送之前都将发送完成标志位清零,这里也将接收完成标志位清下零,就当是一个好习惯吧

while(1)

{

if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET)//判断是否有一帧数据接收完成

{

buf[j++] = USART_ReceiveData(USART1); //接收完成的话就直接放到缓存区域里

}

if(10 == j)//接收完成10个之后就跳出去,不再接收了,有个意思就OK了

break;

}

j = 0;//清零一下j变量,使得实验可以反复接收PC发过来的10个数据

GPIO_SetBits(GPIOA, GPIO_Pin_8);//将sp3485设置为发送数据

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);

delay_ms(2);//稍稍延时一下,原因去查看sp3485的手册吧

for(i = 0; i 《 10; i++)

{

USART_SendData(USART1, buf[i]);//将数据依次发送出去

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);

}}}

注:在用STM32的串口做485通信的时候,发送数据的时候,检测到最后一个数据发送后的标志位已经置位,但是还不能立即失能485芯片的发送引脚,因为虽然标志位已经置位,485芯片的数据还没有完全发送出去,这个时候需要ms级别的延时,一般2个毫秒左右基本就没有问题了。

RCC设置函数:

void RCC_Configuration(void)

{

/* RCC system reset(for debug purpose) */

RCC_DeInit();

/* Enable HSE */

RCC_HSEConfig(RCC_HSE_ON);

/* Wait till HSE is ready */

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(HSEStartUpStatus == SUCCESS)

{

/* HCLK = SYSCLK */

RCC_HCLKConfig(RCC_SYSCLK_Div1);

/* PCLK2 = HCLK */

RCC_PCLK2Config(RCC_HCLK_Div1);

/* PCLK1 = HCLK/2 */

RCC_PCLK1Config(RCC_HCLK_Div2);

/* Flash 2 wait state */

FLASH_SetLatency(FLASH_Latency_2);

/* Enable Prefetch Buffer */

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

/* PLLCLK = 8MHz * 9 = 72 MHz */

RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

/* Enable PLL */

RCC_PLLCmd(ENABLE);

/* Wait till PLL is ready */

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

{

}

/* Select PLL as system clock source */

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

/* Wait till PLL is used as system clock source */

while(RCC_GetSYSCLKSource() != 0x08)

{

}}

/* Enable USART1 and GPIOA clock */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);

}

GPIO设置函数:

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

/* Configure USART1 Tx (PA.09) as alternate function push-pull */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Configure USART1 Rx (PA.10) as input floating */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Configure PC. as Output push-pull */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//GPIO_Mode_Out_PP = 0x10

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//GPIO_Mode_Out_PP = 0x10

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC, &GPIO_InitStructure);

}

USART设置函数:

void USART_Configuration(void)

{

USART_InitTypeDef USART_InitStructure;

USART_ClockInitTypeDef USART_ClockInitStructure;

USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;

USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;

USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;

USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;

/* Configure the USART1 synchronous paramters */

USART_ClockInit(USART1, &USART_ClockInitStructure);

USART_InitStructure.USART_BaudRate = 9600;

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;

/* Configure USART1 basic and asynchronous paramters */

USART_Init(USART1, &USART_InitStructure);

/* Enable USART1 */

USART_Cmd(USART1, ENABLE);

}

NVIC设置函数:

void NVIC_Configuration(void)

{

#ifdef VECT_TAB_RAM

/* Set the Vector Table base location at 0x20000000 */

NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);

#else /* VECT_TAB_FLASH */

/* Set the Vector Table base location at 0x08000000 */

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);

#endif

}


关键字:STM32  调试  SP3485 引用地址:STM32调试SP3485技术总结

上一篇:stm32内部时钟有哪些时钟源 stm32使用内部时钟配置教程
下一篇:Zephyr笔记:在STM32F429上运行HelloWorld

推荐阅读最新更新时间:2024-11-13 10:53

STM32单片机特性解析
STM32单片机 由ST厂商推出的STM32系列单片机,行业的朋友都知道,这是一款性价比超高的系列单片机,应该没有之一,功能及其强大。其基于专为要求高性能、 低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M内核,同时具有一流的外设:1μs的双12位ADC,4兆位/秒的UART,18兆位/秒的SPI等等,在功耗和集成度方面也有不俗的表现,当然和MSP430的功耗比起来是稍微逊色的一些,但这并不影响工程师们对它的热捧程度,由于其简单的结构和易用的工具再配合其强大的功能在行业中赫赫有名。其强大的功能主要表现在: 特性 1、内核:ARM32位Cortex-M3CPU,最高工作频率72MHz,1.25DMIPS/MHz,单周
[单片机]
STM32固件库的命名规则
1、系统文件名和源文件名以 stm32f10x_ 的形式表示 2、在单一文件中使用的常量在该文件中定义。在多个文件中使用的常量定义在头文件中。所有常量都以大写字母表示。 3、寄存器当做常量看待,同样以大写字母表示,多数情况下,在STM3210X参考手册中使用相同的缩写。 4、外围模块的功能函数的名字,需要有相应的外围模块缩写加下划线这样的前缀,每个单词的首字符要大写。例如SPI_SendData,在一个函数名中,只允许有一条下划线,用来区分外围模块缩写和剩下的函数名。 5、使用X_InitTypeDef中指定的参数初始化X外围模块的函数,被命名为X_Init. 6、复位X外围模块的寄存器为默认值的函数,命名为X_DeInit
[单片机]
STM32的IO口的8种配置(GPIO)
1 /` STM32的输入输出管脚有下面8种可能的配置:(4输入+2输出+2复用输出) ① 浮空输入_IN_FLOATING ② 带上拉输入_IPU ③ 带下拉输入_IPD ④ 模拟输入_AIN ⑤ 开漏输出_OUT_OD ⑥ 推挽输出_OUT_PP ⑦ 复用功能的推挽输出_AF_PP ⑧ 复用功能的开漏输出_AF_OD 1.1I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关(芯片内部在I/O口 的输出部分安排了多个响应速度不同的输出
[单片机]
学习STM32之认识常用函数
很多学了51单片机的小伙伴后选择学习更加高级的stm32的时候,就被stm32的代码吓到了,无数多个函数是否把你压得喘不过气?但是实际上一个硬件高手看到一段硬件代码,即使没有任何注释也能将代码读个七七八八。就是因为硬件代码中的各个函数的名字虽然长,但是却十分有规律,虽然多,但却可以总结,希望我这个博客可以增加初学者对于stm32代码的阅读能力。 以下是对stm32f4中一些常用函数的归纳: 当你把这些函数都记住了,那么学习stm32阅读代码的时候,把这些函数部分和初始化部分除开,其实就会发现剩下的代码也就不多了。
[单片机]
学习<font color='red'>STM32</font>之认识常用函数
STM32的printf使用
#include //加入以下代码,支持printf函数,而不需要选择use MicroLIB #if 1 #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)==
[单片机]
STM32之窗口看门狗原理
stm32有两个看门狗,独立看门狗和窗口看门狗,其实两者的功能是类似的,只是喂狗的限制时间不同。 独立看门狗是限制喂狗时间在0-x内,x由你的相关寄存器决定。喂狗的时间不能过晚。 窗口看门狗,所以称之为窗口就是因为其喂狗时间是一个有上下限的范围内,你可以通过设定相关寄存器,设定其上限时间和下限时间。喂狗的时间不能过早也不能过晚。 图1 窗口看门狗的 上窗口就是配置寄存器WWDG- CFR里设定的W ; 下窗口是固定的0x40; 当窗口看门狗的计数器在上窗口值之外,或是低于下窗口值都会产生复位。 图2 && 上窗口的值可以只有设定,7位二进制数最大只可以设定为127(0x7F),最小又必须大于下窗口的0x40,所以其
[单片机]
<font color='red'>STM32</font>之窗口看门狗原理
stm32发送中断编程思路
查询方式:发送数据——先发后查; 接收数据——先查后收。 中断方式:发送数据——发送、等待中断、中断中发送; 接收数据——等待中断、在中断中接收。 发送一个字符串 查询发送:发送完一个字节,等待发送完,继续发送下个字节,直到整个字符串发送完 在这期间一直占用CPU 中断发送:发送完一个字节CPU响应中断将下个字节放到外设寄存器,直到整个字符串发完 只有在中断时占用CPU资源 串口发送中断我只用过一次: 只要将第一个字节送进串口发送数据寄存器,就可以在串口发送中断里依次把剩余的字节都发送完,省去了等待每一个字节发送完的时间。 不过这是在AVR中用的。STM32的
[单片机]
基于STM32芯片和TFT-LCD的便携式心电图仪设计
便携式心电图设备的出现使心电信号能够在更多场合进行采集,它既可以实现可移动化,又可以实时的对心电信号进行分析。通过内置大容量存储器件能够对患者进行长时间的实时监护,并记录患者的心电数据,通过USB接口与PC机进行数据传输,以提交到专业医疗机构做进一步分析和诊断。 1、系统整体设计概述 系统原理框图可以用图1表示。心电信号由电极获取,送入心电采集电路,经前置放大、主放大、高低通滤波、电平抬升后,得到符合要求的心电信号,并送入到STM32的ADC进行AD转换。为了更好地抑制干扰信号,在电路中还引入了右腿驱动电路。系统控制芯片采用STM32,TFT-LCD的触摸功能加上少量按键可以建立良好的人机交互环境,可以通过LCD实时显示和回放
[单片机]
基于<font color='red'>STM32</font>芯片和TFT-LCD的便携式心电图仪设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved