STM32待机模式Standby Mode与ADC DMA模式测试备忘
2015-06-18 12:07
309 查看
1)STM32运行十秒后自动进入待机,使用WakeUp引脚唤醒CPU后,重复以上动作。
其他都没什么,最重要的是注意要清一下唤醒标志位 __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
因为cpu唤醒第一次后,会置位PWR_FLAG_WU和PWR_FLAG_SB,假如不清除,第二次待机就实现不了了。
2)打开ADC,使用扫描模式,分别采样Ch7和Ch8数据,存放于一个数组内
![](http://img.blog.csdn.net/20150618205511834?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamF0YW1hdGFkYWRh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20150618205525651?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamF0YW1hdGFkYWRh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20150618205537001?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamF0YW1hdGFkYWRh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20150618205550378?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamF0YW1hdGFkYWRh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
库函数用起来还是非常方便的
dma就会自动将adc的数据采样100个,放到adc_value 这个数组内,排放顺序当然是adc_value[0]放Ch7,adc_value[1]放Ch8,adc_value[2]放Ch7,adc_value[3]放Ch8。。。以此交错放置,采样完会产生中断。
上面是Stm32Cube自动生成的代码,挺方便的,中断后会自动进入这个函数,这时只需要再自己写一个
到这里,ADC采样一百个点完成,都存放在adc_value[100]这个数组里了,简单吧。
完。
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)<span style="white-space:pre"> </span>//系统给出的弱定义空函数然后就可以关闭ADC
//shut down adc HAL_ADC_Stop_DMA(&hadc);
到这里,ADC采样一百个点完成,都存放在adc_value[100]这个数组里了,简单吧。
完。
相关文章推荐
- 【转】Vmware上安装Vxworks 5.5
- 浅析js绑定同一个事件依次触发问题系列(一)
- 宾利车怎样归零
- Git 分支-利用分支进行开发的工作流程
- java接口的基本使用
- unity www读取本地视频文件和外部视频文件 播放视频动画和视频声音
- 在AngularJS应用中实现一些动画效果的代码
- [android]简单方法记载 在adapter中异步加载网络图片
- 日语学习之沪江N3基础 20150618 -2
- 安卓开发拨号器
- iOS第三方(ActionSheet)-JTSActionSheet
- 使用MAVEN配置Selenium
- C实现 LeetCode->Merge Two Sorted Lists (双指针大法)
- Solr5 DataImport 处理1对多关系
- Android之带渐变动画的欢迎界面
- 数据结构——顺序表(c++)
- Left Menu抽屉效果ScrollView姿态共存冲突
- #leetcode#Triangle
- php常用表单验证类用法实例
- 关于css定位