crazyflie2.0原理图之STM32F405与nRF51822串口1M速率的接收和发送

1,状态记录:

目前的状态:

(1)STM32F405R程序下载没有问题,LED测试程序OK

(2)nRF51822 256K程序下载没有问题,LED测试程序OK

(3)STM32F405R驱动MPU9250没有问题,可以正确的读取到ID

(4)nRF51822 256K的crazyflie20程序可以下载,可以进入Bootloader,从手机端看到nRF51822 BLE的信息

(5)尝试测试PWM,使得电机4转起来,看上去转动也没有问题

(6)尝试通过ST-Link调试STM32F405R,没有问题

(7)STM32F405R与nRF51822的串口调试通过

(8)STM32F405R驱动EEPROM
24AA64FT成功,板子上rework了两个上拉1K的电阻,才可以成功读取写入数据

下一步需要调试的电路:

(1)买个锂电池,BQ24075电源控制电路;

(2)BLE虽然可以识别到,但是上位机crazyflie PC client总是无法识别crazyflie2.0,所以需要进一步确认crazyradio是否真的把数据通过esb无线发送出去。

(3)LPS25H气压计由于焊接问题,目前驱动读不到数据

2,串口部分

STM32F405R这边串口用了三个引脚RX,TX和CTS(Flow Control),所以nRF51822那边同样用到三个引脚分别是TX,RX和RTS,从nRF51822的datasheet可以看到有关RTS部分的讲解,看如下图可以知道,当RTS拉低的时候STM32F405R串口可以发送数据,当RTS拉高的时候,相当于通知STM32F405R先不要发送数据。

从原理图上看,STM32F405R这边连接的Flow
control引脚是PA4,为了验证分析的正确性,看了下crazyflie-firmware\drivers\src\uart_syslink.c中看到如下程序:

#define UART_TXEN_PERIF       RCC_AHB1Periph_GPIOA
  #define UART_TXEN_PORT        GPIOA
  #define UART_TXEN_PIN         GPIO_Pin_4
  #define UART_TXEN_EXTI        EXTI_Line4
void uartInit(void)
{
  USART_InitTypeDef USART_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  EXTI_InitTypeDef extiInit;

  /* Enable GPIO and USART clock */
  RCC_AHB1PeriphClockCmd(UART_GPIO_PERIF, ENABLE);
  ENABLE_UART_RCC(UART_PERIF, ENABLE);

  /* Configure USART Rx as input floating */
  GPIO_InitStructure.GPIO_Pin   = UART_GPIO_RX_PIN;
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(UART_GPIO_PORT, &GPIO_InitStructure);

  /* Configure USART Tx as alternate function */
  GPIO_InitStructure.GPIO_Pin   = UART_GPIO_TX_PIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
  GPIO_Init(UART_GPIO_PORT, &GPIO_InitStructure);

  //Map uart to alternate functions
  GPIO_PinAFConfig(UART_GPIO_PORT, UART_GPIO_AF_TX_PIN, UART_GPIO_AF_TX);
  GPIO_PinAFConfig(UART_GPIO_PORT, UART_GPIO_AF_RX_PIN, UART_GPIO_AF_RX);

#if defined(UART_OUTPUT_TRACE_DATA) || defined(ADC_OUTPUT_RAW_DATA) || defined(IMU_OUTPUT_RAW_DATA_ON_UART)
  USART_InitStructure.USART_BaudRate            = 2000000;
  USART_InitStructure.USART_Mode                = USART_Mode_Tx;
#else
  USART_InitStructure.USART_BaudRate            = 1000000;
  USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;
#endif
  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_CTS;
  USART_Init(UART_TYPE, &USART_InitStructure);

  uartDmaInit();

  // TODO: Enable
  // Configure Tx buffer empty interrupt
  NVIC_InitStructure.NVIC_IRQChannel = UART_IRQ;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_UART_PRI;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  vSemaphoreCreateBinary(waitUntilSendDone);
  uartDataDelivery = xQueueCreate(40, sizeof(uint8_t));

  USART_ITConfig(UART_TYPE, USART_IT_RXNE, ENABLE);

  //Setting up TXEN pin (NRF flow control)
  RCC_AHB1PeriphClockCmd(UART_TXEN_PERIF, ENABLE);

  bzero(&GPIO_InitStructure, sizeof(GPIO_InitStructure));
  GPIO_InitStructure.GPIO_Pin = UART_TXEN_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(UART_TXEN_PORT, &GPIO_InitStructure);
  extiInit.EXTI_Line = UART_TXEN_EXTI;
  extiInit.EXTI_Mode = EXTI_Mode_Interrupt;
  extiInit.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
  extiInit.EXTI_LineCmd = ENABLE;
  EXTI_Init(&extiInit);
  NVIC_EnableIRQ(EXTI4_IRQn);
  //Enable UART
  USART_Cmd(UART_TYPE, ENABLE);

  isInit = true;
}
void uartTxenFlowctrlIsr()
{
  EXTI_ClearFlag(UART_TXEN_EXTI);
//上升沿,关闭dma,停止发送
  if (GPIO_ReadInputDataBit(UART_TXEN_PORT, UART_TXEN_PIN) == Bit_SET)
  {
    uartPauseDma();
    //ledSet(LED_GREEN_R, 1);
  }
  else//下降沿,打开dma,恢复发送
  {
    uartResumeDma();
    //ledSet(LED_GREEN_R, 0);
  }
}

上面的中断程序通过如下中断程序引用,这个pin就是在检测nRF51822 RTS p0.14的上升沿和下降沿

void DONT_DISCARD EXTI4_IRQHandler(void)

{

uartTxenFlowctrlIsr();

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-04 15:44:40

crazyflie2.0原理图之STM32F405与nRF51822串口1M速率的接收和发送的相关文章

硬件篇——2_crazyflie2.0原理图之STM32F405

1,状态记录: 目前的状态: (1)STM32F405R程序下载没有问题,LED测试程序OK (2)nRF51822 256K程序下载没有问题,LED测试程序OK (3)STM32F405R驱动MPU9250没有问题,可以正确的读取到ID (4)nRF51822 256K的crazyflie20程序可以下载,可以进入Bootloader,从手机端看到nRF51822 BLE的信息 (5)尝试测试PWM,使得电机4转起来,看上去转动也没有问题 (6)尝试通过ST-Link调试STM32F405R,

51单片机串口通信(字符串接收和发送)

1 #include<reg52.h> 2 3 //------------------串口通信协议-----------------// 4 /* 5 客户端数据包格式解释(长度恒为15): 6 例如:A01_fmq_01Off___# 7 A--------数据包的开始标记(可以为A到Z,意味着数据包可以有26种) 8 01-----设备代号 9 fmq_01Off___--------指令(长度恒为10),指令的前4个人字符是指令头部,指令的后6个字符是指令尾部 10 #--------

crazyflie2.0状态记录

1,状态记录: 目前的状态: (1)STM32F405R程序下载没有问题,LED测试程序OK (2)nRF51822 256K程序下载没有问题,LED测试程序OK (3)STM32F405R驱动MPU9250没有问题,可以正确的读取到ID (4)nRF51822 256K的crazyflie20程序可以下载,可以进入Bootloader,从手机端看到nRF51822 BLE的信息 (5)尝试测试PWM,使得电机4转起来,看上去转动也没有问题 (6)尝试通过ST-Link调试STM32F405R,

硬件篇——1_crazyflie2.0原理图分析之电源部分

从研二就开始准备想做一个微型飞控,那时候在bitcraze上看到了该类飞控的原型设计,于是想模仿做一个,一直在准备中,现在已经是工作第二个年头,准备的时间已经差不多了.正好在最近要动手做的时候,他们推出了2.0版本,所以也就开始从这个版本来做.目前还在焊接调试各种硬件电路阶段,好多都是QFN的package,焊接总体来说相对以前难一些,但是还好都顺利搞定,没有费片子,毕竟焊烂掉一块儿,浪费的不仅仅是钱更重要的是时间啊! 状态记录: 目前的状态: (1)STM32F405R程序下载没有问题,LED

STM32的串口采用DMA方式接收数据测试(转)

STM32的串口采用DMA方式接收数据测试 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.   参考链接:http://www.amobbs.com/forum.PHP?mod=viewthread&tid=5511863&highlight=dma%E6%8E%A5%E6%94%B6   环境: 主机:WINXP 开发环境:MDK4.23 MCU:STM32F103CBT6 说明: 串口可以配置成用DMA的方式接收数据,不过DMA需要定长才

串口通信基础,接收,发送数据

通信接口背景知识 设备之间通信的方式 一般情况下,设备之间的通信方式可以分成并行通信和串行通信两种.它们的区别是: 串行通信的分类 1.按照数据传送方向,分为: 单工:数据传输只支持数据在一个方向上传输:    半双工:允许数据在两个方向上传输.但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信:它不需要独立的接收端和发送端,两者可以合并一起使用一个端口.    全双工:允许数据同时在两个方向上传输.因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端.

crazyflie2.0 RCC时钟知识

由于目前手里只有16MHZ的2520封装的贴片晶振,8MHZ这种封装做不到这么小,所以就先用16MHZ,这样我们就需要修改程序相关的RCC时钟: 1,stm32f4xx.h #define HSE_VALUE    ((uint32_t)16000000) /*!< Value of the External oscillator in Hz */ 2,system_stm32f4xx.c /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N

QT 串口通信 数据16进制发送

在QT中进行串口通信时,很多情况要用到发送16进制的数据.从网上找来了一段代码测试能用: static QByteArray QString2Hex(QString str) { QByteArray senddata; int hexdata,lowhexdata; int hexdatalen = 0; int len = str.length(); senddata.resize(len/2); char lstr,hstr; for(int i=0; i<len; ) { hstr=st

51单片机串口接收和发送数据

第一种方法:在中断中处理 typedef unsigned char UINT8; volatile UINT8 u8Uart_Data; void InitialUART0_Timer1() { SCON = 0x50; //2015-05-04 TMOD = 0x20; TH1 = 0XFD; // 9600BPS 2015-05-04 wangrong TL1 = 0XFD; TR1 = 1; // start timer0 ES = 1; // Enable serial interru