跟猫一起酸汤面系列:第六天 nRF24L01(Si24R1)

第五天,今天不吃酸汤面,nRF24L01模块到了,实际是Si24R1
为了调试方便配了一个usb的转换器,球猫的是33的土豪版,而乞丐版是8.5+4.19
土豪版有功放,主控是STM32,乞丐版要插模块,主控是STC,AT命令略有删减
1、装好CH340驱动
2、打开串口助手(putty之类的不行,可能带了回车),速率9600
3、发送AT?,返回所有配置项

OK
系统信息:
波特率:9600
目标地址:     0xFF,0xFF,0xFF,0xFF,0xFF
本地接收地址0:0xFF,0xFF,0xFF,0xFF,0xFF
通讯频率:2.400GHz
校验模式:16位CRC校验
发射功率:0dBm
空中传输速率:2Mbps
低噪声放大增益:开启

4、自己给自己发03 31 32 33,没有收到自环
5、下一步计划,找出Arduino先和这个说上话,再研究应用

- 阅读剩余部分 -

跟猫一起酸汤面系列:第五天 小目标RTC

终于实现了一个小目标,RTC唤醒
先记录步骤吧
1、打开RTC,打开闹钟,产生中断
2、设置唤醒计数,默认37kHz/16=2.31kHz,好像最多28秒
2+、发现可以1Hz这样就有18小时,足够了,加1bit似乎用途不大
3、正常点灯熄灯,加一些延时
4、GPIO设置高阻输入,关闭GPIO时钟
5、进入待机模式

  /* USER CODE BEGIN 3 */
  HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
  HAL_Delay(1000);
  HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
  HAL_Delay(1000);

  HAL_PWREx_EnableUltraLowPower();
  HAL_PWREx_EnableFastWakeUp();
  __HAL_RCC_GPIOA_CLK_DISABLE();
  HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
  __HAL_RCC_GPIOA_CLK_ENABLE();     

6、中断唤醒

void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{
  __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
}

7、时钟如果不是MSI,需要重新设一下
8、GPIO时钟打开,如果设置了高阻也要恢复
9、可以继续点灯睡觉了

跟猫一起酸汤面系列:第四天 按键中断

原计划是RTC中断的,睡9秒钟,唤醒1秒钟,牵扯比较多的技术点,搞不定
第四天险些难产,降低标准,目标按键中断
猫说涉两个技术NVIC和EXTI,找文章做起来《一知半解学CubeMX——GPIO:外部(按键)中断》
1、定义一个中断脚PA7(GPIO_EXTI7),GPIO属性钟设置上拉
2、NVIC中打开EXTI line 4 to 15,对应代码

/*Configure GPIO pin : KEY_Pin */
GPIO_InitStruct.Pin = KEY_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(KEY_GPIO_Port, &GPIO_InitStruct);
/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);

3、新建中断处理函数

/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if (GPIO_Pin == KEY_Pin)
    {
        HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
    }
}
/* USER CODE END 4 */

4、低电平触发,不过没有防抖,据说在中断中HAL_Delay是不起作用的,猫说:可以是可以,不过一般不这么做

参考文献:
https://blog.csdn.net/xukao5671927/article/details/78436154
https://blog.csdn.net/weixin_43892323/article/details/104383560

跟猫一起酸汤面系列:第三天 学睡觉

睡觉是降低功耗的有效手段,怎么睡,睡成什么样子都是要学习的
以前的328P运行大概是10ma的级别,也可以睡觉,后来发现青蛙是ma级别,再发现通过降频似乎可以进入ua级别了,
结合睡觉技术,似乎碰到了na的边缘
参考了JJ老师5年前的文章http://forum.eepw.com.cn/thread/278079/1
睡觉的关键代码:

HAL_PWREx_EnableUltraLowPower();
//HAL_PWR_EnterSLEEPMode(PWR_LOWPOWERREGULATOR_ON,PWR_SLEEPENTRY_WFI);
//HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI);
HAL_PWR_EnterSTANDBYMode();

JJ老师说,一次睡不着就掉电重新睡,结果......真的睡着了,程序都没有办法更新了,最后受田鸡和猫的启发,通过拉高boot0的办法解决,还是加个延时再睡比较稳妥

LL_mDelay(995);
LL_PWR_EnableUltraLowPower();
SET_BIT(PWR->CR, PWR_CR_PDDS);
SET_BIT(SCB->SCR, SCB_SCR_SLEEPDEEP_Msk);
#if defined ( __CC_ARM)
    __force_stores();
#endif
__WFI();

至于为什么是这个姿势睡,以后要仔细研究寄存器参考手册,还有就是如何唤醒。

跟猫一起酸汤面系列:第二天 点灯

第二天点灯吧,不点个灯什么的说不过去,前置条件,硬件都准备好了,软件开发环境也下载好,支持包装好。
灯,等灯,等灯,......
1、打开STM32CubeMX
2、新建一个项目(Ctrl+N)
3、选择一个MCU,STM32L011D4,Start Project
4、左下角PA4左键选GPIO_Output,右键选Enter User Label,输入LED
5、项目页起名Day.02,找个文件夹,结构选Basic,IDE选MDK-ARM,V5.27
6、下面选择只引入需要的文件,再下面库都选择LL
7、GENERATE CODE可能什么地方没配置好,不能自动弹出IDE
第二阶段,打开Day.02\MDK-ARM\Day.02.uvprojx
1、提示需要安装STM32L0xx_DFP,已经下过离线,装一下就好
2、F7编译提示,error: L6236E: No section matches selector - no section to be FIRST/LAST.
3、缺少启动文件,Drivers/CMSIS中添加startup_stm32l011xx.s就好
4、Option中选择STLink,如果需要驱动看前一天,F8下载程序到开发板
5、实际不运行,需要点击RST来启动,灯也不亮,为啥?还没写点灯代码

/* USER CODE BEGIN 3 */
LL_mDelay(500);
LL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);

HAL库

/* USER CODE BEGIN 3 */
HAL_Delay(950);
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
HAL_Delay(5);
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);

6、代码添加在main.c中,位置很重要,否则会被冲,编译,下载,RST,小灯闪起来!