历史上的今天
今天是:2025年08月13日(星期三)
2018年08月13日 | stm32 485串口数据的收发
2018-08-13 来源:eefocus
//串口初始化:
#define EN_USART2_RX 1
void RS485_Init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOG, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // RE
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2 TX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3 RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);//í£?1?′??
#ifdef EN_USART2_RX //
USART_InitStructure.USART_BaudRate = 9600;//波特率9600;
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(USART2, &USART_InitStructure); ;
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //指定中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //中断抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //′中断响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 中断函数使能
NVIC_Init(&NVIC_InitStructure);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//接收终端使能
USART_Cmd(USART2, ENABLE); //串口使能
#endif
RS485_TX_EN=0; //默认配置为接收模式 这里可以用GPIO_ResetBits(GPIOG,GPIO_Pin_9),同样置1可用GPIO_SetBits(),
}
//串口的中断函数:
void USART2_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
res =USART_ReceiveData(USART2);
RS485_TX_EN = 1;
// 此处发送数据主要是为了检验中断是否进行触发
while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
USART_SendData(USART2,0xff);
while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
RS485_TX_EN = 0;
if(RS485_RX_CNT<64)
{
RS485_RX_BUF[RS485_RX_CNT]=res;、
RS485_RX_CNT++;
}
}
}
好吧,今天又被串口虐的死去活来,最开始一直怀疑是自己的程序写的有问题,纠结串口配置是不是出问题了,最后找个demo自己找问题,发现收发数据是需要控制复位引脚,进行收发控制,我这里是复位引脚置为1,则可以进行发,为0,则表示收数据,当然如果你觉得设置好复位引脚的值就可以进行发送送数据了,呵呵,你看到的还是一片白,我的数据呢??在发送数据之前你需要写这样一条代码
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET),这样我们就用USART_Send(USARTx,data); 发送数据了,之后我们同样还需要用while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET)来处理自己发送的内容,看上去复杂吧,呵呵。
下面给出具体步骤:
1. 像配置232串口一样配置rs485的引脚,使能相应的时钟。
RX: GPIO_Mode_IN_FLOATING/GPIO_Mode_IPD
TX: GPIO_Mode_Out_PP
RE: GPIO_Mode_Out_PP
2. 进行中断配置
3. 记得使能中断和串口。
具体还是看代码吧。
史海拾趣
|
IO操作中我准备做两个实验 (1) 用IO口点亮LED,这就是让IO输出低电平(注板上的LED是阴极接在IO口,阳极由VCC串电阻上拉),这个实验是IO输出的实验。目的是熟悉工程配置,IAR的环境很熟悉,第一次做ARM ...… 查看全部问答> |
|
微芯的协议栈说明书上有这么一句 RTOS and application independent 这是什么意思啊?操作系统和应用程序独立?老夫怎么觉得老夫写的应用程序是嵌入到他的操作系统框架里面的呢… 查看全部问答> |
|
准备重新编辑一下的,结果全部都是乱码,还是重新截图吧undefined [ 本帖最后由 Leo417love 于 2013-8-6 21:21 编辑 ]… 查看全部问答> |
|
买的开发板包装胶布被弄断,不是自己签收的,问题是我还弄不清倒是是卖家少邮东西.... 不知道发在这里合不合适,心里很是疑惑想问问大家,我在淘宝上买的别人的开发板,全新的两套,之后呢东西今天到了,因为我去上课,是别人签收的,我租的旅店的一个房间,回来之后店主把快件给我了,我惊奇的发现箱子一边的胶布被弄开了,我打开看里 ...… 查看全部问答> |
|
新手求教 cc2541 sensortag 外加sensor的方案讨论 各位大神,小弟正在纠结于学校的一project 需要了解如何外接而外sensor通过sensortag帮助蓝牙发送数据去PC端,该如何实现呢? 现在的想法是通过sensortag上的P1-1-6的端口用I2C OR UART 连接?是否可行,求教具体的操作 感激不敬!… 查看全部问答> |
|
LM386是专为低损耗电源所设计的功率放大器集成电路。它的内建增益为20,透过pin 1 和pin8脚位间电容的搭配,增益最高可达200。LM386可使用电池为供应电源,输入电压范围可由4V~12V,无作动时仅消耗4mA电流,且失真低。LM ...… 查看全部问答> |




