历史上的今天
今天是:2025年08月15日(星期五)
2019年08月15日 | STM32待机模式Standby Mode与ADC DMA模式测试备忘
2019-08-15 来源:eefocus
1)STM32运行十秒后自动进入待机,使用WakeUp引脚唤醒CPU后,重复以上动作。
int main(void)
{
time_cnt = 0;
HAL_Init();
SystemClock_Config();
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_RESET);
HAL_PWR_DisableWakeUpPin(PWR_CSR_EWUP); //禁止wakeup PA0引脚,可以用来做普通引脚功能
while (1)
{
HAL_Delay(1000);
HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_13); //运行时,闪LED
time_cnt++;
if(time_cnt >= 10) //10秒后,进入待机模式
{
time_cnt = 0;
//打开wakeup引脚,待机后来个上升沿就可以唤醒cpu了
HAL_PWR_EnableWakeUpPin(PWR_CSR_EWUP);
//清除wakeup_flag,这里很重要,假如没有,就不能重复的让cpu唤醒再进入待机
//即HAL_PWR_EnterSTANDBYMode()将不起作用!!
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
//cpu进入待机模式,NREST Pin,IWDG,RTC alarm,WakeUp引脚上升沿,都可以唤醒cpu
HAL_PWR_EnterSTANDBYMode();
}
}
}
其他都没什么,最重要的是注意要清一下唤醒标志位 __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
因为cpu唤醒第一次后,会置位PWR_FLAG_WU和PWR_FLAG_SB,假如不清除,第二次待机就实现不了了。
2)打开ADC,使用扫描模式,分别采样Ch7和Ch8数据,存放于一个数组内




库函数用起来还是非常方便的
__IO uint16_t adc_value[100];
//start adc
HAL_ADC_Start_DMA(&hadc, (uint32_t*)&adc_value[0], 100);
dma就会自动将adc的数据采样100个,放到adc_value 这个数组内,排放顺序当然是adc_value[0]放Ch7,adc_value[1]放Ch8,adc_value[2]放Ch7,adc_value[3]放Ch8。。。以此交错放置,采样完会产生中断。
void DMA1_Channel1_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Channel1_IRQn 0 */
/* USER CODE END DMA1_Channel1_IRQn 0 */
HAL_NVIC_ClearPendingIRQ(DMA1_Channel1_IRQn);
HAL_DMA_IRQHandler(&hdma_adc);
/* USER CODE BEGIN DMA1_Channel1_IRQn 1 */
/* USER CODE END DMA1_Channel1_IRQn 1 */
}
上面是Stm32Cube自动生成的代码,挺方便的,中断后会自动进入这个函数,这时只需要再自己写一个
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
//自定义功能
}
来替换掉系统的弱定义函数就可以了。
__weak void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) //系统给出的弱定义空函数
然后就可以关闭ADC
//shut down adc
HAL_ADC_Stop_DMA(&hadc);
到这里,ADC采样一百个点完成,都存放在adc_value[100]这个数组里了,简单吧。
完。
史海拾趣
|
分别用C语言和汇编语言进行程序设计,计算正弦函数值,并比较代码效率。 1)C语言编程 #include #define NX 180 //最大正弦角度 #define pi 3.14159 short i; double x[NX] //定义输入正弦角度数组(弧度值) double r[NX] //定义输出 ...… 查看全部问答> |
|
我现在知道的在ARM里软件中断(SWI call)是用来将模式转换成超级用户模式的(SVC mode) 然后用这两句话可以将SWI的参数储存在R0里面 LDR R0,[LR,#-4] BIC R0,R0, #0xFF000000 因为刚刚学习ARM, 现在我不理解的是这个SWI的参数到底可以用来干什么 ...… 查看全部问答> |
|
求助:VS.NET 2008下WINCE模拟器 需要带网络连接功能 VS.NET 2008不像03提供了WINCE模拟器 求助 刚折腾了一个版本 不带网络功能 即希望在模拟器上可以配置IP PING通 这样可以测试一些访问MSSQL的程序 谢谢 不知道表达清楚了没有……汗… 查看全部问答> |
|
流小驱动SRB.NumberOfPhysicalPages时钟为0 修改DDK中testcap 做的摄像头驱动,想使用DMA得到数据。DDK文档中说SRB的ScatterGatherBuffer就是作为DMA使用的,NumberOfPhysicalPages是其中的元素个数。但是我在生成图像的ImageSynth函数中得到的NumberOfPhysicalPages却始终为0. ...… 查看全部问答> |
|
NandFlash块大小为16K,如果写一个不足16K的文件进去,是不是要把该块剩下的空间写成0? NandFlash块大小为16K,如果写一个不足16K的文件进去,是不是要把该块剩下的空间写成0?… 查看全部问答> |
|
利用控制面板中的“校准”,校准后总是不能正常退出。串口打印提示 : M 474,507 507,520 33,13M 2061,1655 2099,1655 38,0Maximum Allowed Error 7: Maximum error 13325 exceeds calibration th ...… 查看全部问答> |
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 苹果公司的iPhone把智能手机从专注于通讯的设备变成了以应用为中心的多用途移动平台,可以用于许多产业之中。据iSuppli公司,其它智能手机平台迅速跟进,纷纷增加了多点触控用户界面、应用开发 ...… 查看全部问答> |
|
我设计的无限温度传感网络由一个路由设备和两个温度测量节点组成。两个测温节点的程序应该是一样的吧?我是通过长地址(IEEE地址)来在路由设备上区分两个节点的数据的,部分原代码如下:unsigned int current_temperature1 = 0;unsigned int curre ...… 查看全部问答> |




