打印
[STM32F1]

STM32同步通讯问题,大虾们 来围观!!

[复制链接]
3806|35
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
仙人球W|  楼主 | 2014-10-9 16:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
江湖规矩先贴代码:
  void System_Init(void)
{
        RCC_Configuration();                   //开启外设时钟        //SYSCLK=8MHz
            GPIO_Configuration();
            USART_Initial();
           NVIC_Configuration();
}

void USART_Initial(void)
{
           USART_DeInit(USART1);
           USART_StructInit(&USART_InitStructure);
           USART_Init(USART1,&USART_InitStructure);
           USART1->CR1|=0x206c;        //;USART模块使能,允许接收发送,使能USART中断
           USART1->BRR=0x1A0A;//BaudRate;//; //19133  bits/s;
}

void NVIC_Configuration(void)
{
       NVIC_InitTypeDef NVIC_InitStructure;

       /*USART 配置*/
       /* Configure USART1 Tx (PA.09) as alternate function push-pull */
       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
       /*对于发送PIN必须配置成复用输出上拉否则不能正常发送*/
       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;
       /*对于接收PIN必须配置成浮点输入否则不能正常接收*/
       GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;
       GPIO_Init(GPIOA, &GPIO_InitStructure);

        /* Configure I2C2 pins: SCL and SDA ----------------------------------------*/
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
      GPIO_Init(GPIOB, &GPIO_InitStructure);

}

void RCC_Configuration(void)
{       
    #define  GPIO_Remap_JTAG_Disable    0x04000000   
        /* Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1|
                                                           RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|
                                                            RCC_APB2Periph_GPIOD,ENABLE);         
        //启动IO口的复用功能(AFIO),        用于外部中断
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
       /*使能I2C2, SPI2 时钟*/
       RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2|RCC_APB1Periph_TIM2, ENABLE );

        //不使用外部晶振影射PD0,PD1到OSC_IN,OSC_OUT.
        GPIO_PinRemapConfig(GPIO_Remap_PD01, ENABLE );
//    #if !DebugModel
//       AFIO->MAPR|=GPIO_Remap_JTAG_Disable;  // 使能与JTAG复用的GPIO 使GPIO可用。
//    #endif
        //使能FSMC时钟
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
}
这是准备部分,只贴一部分  大家都懂哈!

void USART1_IRQHandler(void)     
{
        #define LCD485_Address  0x10
        BYTE  RecTemp;
       
        if(USART1->SR&0x40) //发送
           {
                     USART1->SR&=~0x40;
                     if(SCIStartSent)
               {
                       if(SendCounter<SendBuffer[0])
                                  USART1->DR=SendBuffer[SendCounter++];
                       else
                           {
                                   if(!SCIRece)sentIntervalDelay = 3; // 3ms 完成一循通信稍做延时以便SCI有空闲做下次通信,此种情况专属sentkey
                                //SCIErrorCN=0;
                                    SCISentDis;
                                    SendCounter=0;
                                    SCIStartSent=0;
                                }
                     }
           }

         if(USART1->SR&0x20) //接收
             {
                      RecTemp=USART1->DR;
                      if(AddrEqual==0)
                      {
                       if(RecTemp==LCD485_Address)
                          {
                               AddrEqual=1;  //被正确询址
                               }
                      }
                     else
               {
                       if(SendCounter==0)
                                ReceBuffer[SendCounter++]=RecTemp;  //接收到长度
                         else if(SendCounter<ReceBuffer[0])
                                 ReceBuffer[SendCounter++]=RecTemp;               
                         if(SendCounter==ReceBuffer[0])
                        {
                                 SendCounter=0;  
                                    if(SCIRece)
                              {
                                        SCIRece=0;
                                        //SCIErrorCN=0;
                                        sentIntervalDelay = 3; // 3ms 完成一循通信稍做延时以便SCI有空闲做下次通信
                                        //scisentpnter = Null;
                               }
                                FinishedRece=1;  //完成一帧数据接收
                       }
                     }
     }
}
串口中断部分

问题如下:
1,如何设置为同步通讯?
2,中断中如何实现同步收发数据?
2,如果用串口猎人高级发码能和MCU同步通讯不?       

备注:现在的设置是异步通信 通讯正常
沙发
仙人球W|  楼主 | 2014-10-9 16:02 | 只看该作者
STM32 同步通讯源码 共享!!

使用特权

评论回复
板凳
仙人球W|  楼主 | 2014-10-9 16:26 | 只看该作者
顶一个!

使用特权

评论回复
地板
化雨眠66| | 2014-10-9 16:47 | 只看该作者
仙人球W 发表于 2014-10-9 16:26
顶一个!

围观。一直都是做异步通讯。

持续支持!!

顶楼主

楼主的同步通讯,主要用作与什么啊?

使用特权

评论回复
5
仙人球W|  楼主 | 2014-10-9 16:53 | 只看该作者
化雨眠66 发表于 2014-10-9 16:47
围观。一直都是做异步通讯。

持续支持!!

1,DSP与STM32同步通讯 把STM32采集的按键值传给DSP 收取DSP运算出的数组值(对应数码管)
2,复制数据 实现STM32和DSP掉电存储数据 相互能复制存储

使用特权

评论回复
6
mmuuss586| | 2014-10-9 18:22 | 只看该作者

你都调好了,还有啥问题

使用特权

评论回复
7
596142041| | 2014-10-9 20:00 | 只看该作者
为啥要同步通讯呢?不明白。我们一般不都是使用异步通讯么?

使用特权

评论回复
8
yklstudent| | 2014-10-10 08:27 | 只看该作者
楼主说说原理呗

使用特权

评论回复
9
仙人球W|  楼主 | 2014-10-10 15:24 | 只看该作者
mmuuss586 发表于 2014-10-9 18:22
你都调好了,还有啥问题

我这个是异步通信 就是贴出来  让大虾们给改改  再给补充一下知识。
1,同步时钟是一个MCU发送就可以了?

使用特权

评论回复
10
仙人球W|  楼主 | 2014-10-10 15:25 | 只看该作者
596142041 发表于 2014-10-9 20:00
为啥要同步通讯呢?不明白。我们一般不都是使用异步通讯么?

(1)总共14字节,键盘与变频器均采用FIFO模式以节省系统开销
(2)通讯头字节固定为0x27,0x62    //
(3)校验字节为命令字节与通讯内容累加计算产生,因为这种方式比CRC可以减少很多计算量。
(4)由于通讯距离可能会较长,通讯波特率4800bps,采用全双工422通讯模式,数据收发不间断进行。每帧数据发送耗时约30ms。
(5)考虑到方便参数16位模式寻址,将校验字节放到前面。

使用特权

评论回复
11
仙人球W|  楼主 | 2014-10-10 15:26 | 只看该作者
596142041 发表于 2014-10-9 20:00
为啥要同步通讯呢?不明白。我们一般不都是使用异步通讯么?

(1)总共14字节,键盘与变频器均采用FIFO模式以节省系统开销
(2)通讯头字节固定为0x27,0x62    //
(3)校验字节为命令字节与通讯内容累加计算产生,因为这种方式比CRC可以减少很多计算量。
(4)由于通讯距离可能会较长,通讯波特率4800bps,采用全双工422通讯模式,数据收发不间断进行。每帧数据发送耗时约30ms。
(5)考虑到方便参数16位模式寻址,将校验字节放到前面。

为了配合DSP的通讯方式

使用特权

评论回复
12
仙人球W|  楼主 | 2014-10-10 15:26 | 只看该作者
yklstudent 发表于 2014-10-10 08:27
楼主说说原理呗

我这是异步通信

使用特权

评论回复
13
仙人球W|  楼主 | 2014-10-10 15:34 | 只看该作者
mmuuss586 发表于 2014-10-9 18:22
你都调好了,还有啥问题

版主 能否指点指点

(1)总共14字节,键盘与变频器均采用FIFO模式以节省系统开销
(2)通讯头字节固定为0x27,0x62    //
(3)校验字节为命令字节与通讯内容累加计算产生,因为这种方式比CRC可以减少很多计算量。
(4)由于通讯距离可能会较长,通讯波特率4800bps,采用全双工422通讯模式,数据收发不间断进行。每帧数据发送耗时约30ms。
(5)考虑到方便参数16位模式寻址,将校验字节放到前面。

使用特权

评论回复
14
huzi2099| | 2014-10-10 18:20 | 只看该作者
异步用usart,同步用spi

使用特权

评论回复
15
mmuuss586| | 2014-10-10 18:40 | 只看该作者
仙人球W 发表于 2014-10-10 15:34
版主 能否指点指点

(1)总共14字节,键盘与变频器均采用FIFO模式以节省系统开销

同步不熟;
和你一样,我也公司上班的,ST的很多东西也没接触过;

那还不如提高波特率呢,不知道你线多长;
我一般用115200的;
线真的很长的话,也可以考虑加无线模块;

使用特权

评论回复
16
仙人球W|  楼主 | 2014-10-11 15:38 | 只看该作者
huzi2099 发表于 2014-10-10 18:20
异步用usart,同步用spi

可以试试

使用特权

评论回复
17
仙人球W|  楼主 | 2014-10-13 08:46 | 只看该作者
同步通讯 没有大神用过么?

使用特权

评论回复
18
lyn3210| | 2014-10-14 11:59 | 只看该作者
iic是同步通信.

使用特权

评论回复
19
lyn3210| | 2014-10-14 11:59 | 只看该作者
spi也是用步通信.

使用特权

评论回复
20
huzi2099| | 2014-10-14 20:47 | 只看该作者
本帖最后由 huzi2099 于 2014-10-14 21:00 编辑

没那么玄,给你补点知识,同步通讯和异步通信是通信的两种方式.
同步方式可以提供很高的通信速率,其数据传送逻辑由同步信号提供,也就是clk,所以凡是硬件上有clk的都是同步方式.spi,iic...
异步方式依赖于固定的时间来区分数据,也就是常说的波特率,收发双方都遵从统一个波特率就可以实现通讯了,凡是需要波特率的都是异步方式usart,can,485...

同步和波特率是矛盾的...所以(4)表示不理解,你中间还有个422末,如果是的话你考虑spi转422就行了(422不了解).
具体的数据格式是软件协议部分,自己整就行了.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

720

帖子

5

粉丝