1.摔碎了
今天刚收到快递 三下五除二装好了 然后拨开开关 显示屏亮了 然后放置小车到地上 按主板上红色按钮 yes! 开始工作了 然后楼主是放桌上测试的 一部注意 掉地上了 尼玛 亚克力板碎了 赶紧拿起小车 赶紧关掉开关 拍拍灰 重新测试 yes! 没坏
2.重新开始
自从发了第一个帖以后就再也没有去碰小车,小车一直被我放到角落里面积灰,最近没事又想拿出来学习一下,我是新手,以前对stm32一点了解都没有,只是玩过一点51单片机。这两天在学习野火的《零死角玩转stm32-初级篇》,学完了有点小感受,在这里记录下来。
《零死角玩转stm32-初级篇》的前几节介绍了环 境搭建,驱动安装和新建模板。里面是基于官方的3.5.0版库文件来讲解的,库文件的作用就是将简单粗暴繁重枯燥的寄存器操作转化成有层次、有逻辑的程序 编辑,直接操作寄存器只需要一条代码,而基于库文件可能需要5、6条甚至更多,但是能使人更加容易上手,逻辑更加清晰,大家可以找《零死角玩转stm32-初级篇》来看一下,写得很好的。
端口配置
GPIO_InitTypeDef myGPIO; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); myGPIO.GPIO_Pin=GPIO_Pin_8; myGPIO.GPIO_Mode=GPIO_Mode_Out_PP; myGPIO.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&myGPIO); GPIO_ResetBits(GPIOB,GPIO_Pin_8);
要操作端口,首先要知道操作的是哪几个端口,输入还是输出,并且输入和输入还分好几种模式,还有端口速率,这些都是在初始化端口时要设置的,因为端口要初始化了才可以用,这是前提。
上面代码中 myGPIO是一个结构体变量,里面会储存端口的配置信息
myGPIO.GPIO_Pin=GPIO_Pin_8; myGPIO.GPIO_Mode=GPIO_Mode_Out_PP; myGPIO.GPIO_Speed=GPIO_Speed_50MHz;这三句就是配置端口的信息。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_Init(GPIOB,&myGPIO);
GPIO_ResetBits(GPIOB,GPIO_Pin_8);这是让端口输出低电平
void SysTick_Init(void) { if(SysTick_Config(SystemCoreClock /100000)) { while(1); } SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk; } //延时函数 void Delay_us(__IO u32 nTime) { TimingDelay=nTime; SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; while(TimingDelay !=0); } //中断服务函数 要在stm32f10x.c调用 void TimingDelay_Decrement(void) { if(TimingDelay !=0x00) { TimingDelay--; } }
按键的操作
按键是连接到I/O口上的,按键按下前后,端口接收到的电平是不一样的,以此来判断按钮是否按下。
端口的操作还和前面端口操作一样,只是模式要变成输入模式,然后一直扫描按键状态,按键扫描的
算法百度有
EXTI外部中断
类似按键,当检测到某GPIO口电平变化,然后执行中断任务。
大概流程:
1、选择端口 设置端口参数 输入 时钟RCC(复用开启AFIO时钟) 初始化
2、NVIC控制器的初始化 中断优先级组 初始化结构体写入参数 中断向量 抢占优先级 和响应优先级
3、EXTI初始化 指定中断输入端口 中断结构体填充 初始化
4、中断服务函数 stm32f10x_it.c
这是我这两天学习的内容,记录下来的过程相当于复习。
3.关于NRF24L01
今天试着将2.4GHz通信模块连接到小车,硬件连接完毕后,下载了测试例程,嗯,连接成功。
于是我试着用野火的方法,重新写一遍驱动程序。首先新建spi_nrf.c文件,SPI的各种配置都写在里面,有初始化程序,连接检测程序,各种收发程序。
小车上NRF使用的端口是SPI1的复用端口PA5.6.7。CE.SCN使用了PB15 PB3。
这里要注意PB3端口,STM32F103 的 JTAG, 默认状态是Full SWJ,PB3作为JDO,被JTAG占用。我就在这个点上卡了一天左右,最后是用万用表去量各端口的电压,发现如果单纯用常规的调用库函数去设置PB3的话,PB3的电压始终是0。所以在运行检测程序的时候老是失败。解决方法是在打开GPIO口时钟后加一句 GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
关闭JTAG的占用,这样就可以快乐地使用PB3了。
这是初始化程序:
void SPI_NRF_Init(void) { SPI_InitTypeDef SPI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; // /* Enable SPI1 and GPIO clocks RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE); ///*!< SPI_FLASH_SPI Periph clock enable RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_8; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); ///*SPI_NRF_SPI SCK,MISO,MOSI,GPIOA^5,GPIOA^6,GPIOA^7 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); ///*SPI_NRF_SPI CE,GPIOA^15 SPI_NRF_SPI CSN: NSS GPIOB^3 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); ///*SPI_NRF_SPI IRQ,GPIOB^4 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; GPIO_Init(GPIOB, &GPIO_InitStructure); NRF_CSN_HIGH(); // /* SPI1 configuration // W25X16: data input on the DIO pin is sampled on the rising edge of the CLK. // Data on the DO and DIO pins are clocked out on the falling edge of CLK. SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitStructure); ///* Enable SPI1 SPI_Cmd(SPI1, ENABLE); }
c2是运行监测程序时向NRF的配置寄存器发送的字节,一共发送5个c2然后再从配置寄存器里面读取5个字节,如果是5个c2的话,说明连接成功
由于只有一台小车,准备用51来驱动另外一块NRF24L01来与小车通信
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |