这是本文档旧的修订版!
| 银杏科技有限公司旗下技术文档发布平台 | |||
| 技术支持电话 | 0379-69926675-801 | ||
| 技术支持邮件 | Gingko@vip.163.com | ||
| 技术论坛 | http://www.eeschool.org | ||
| 版本 | 日期 | 作者 | 修改内容 | 
|---|---|---|---|
| V1.0 | 2020-04-13 | gingko | 初次建立 | 
1. 新建工程:在主界面选择File–>New Project   或者直接点击ACCEE TO MCU SELECTOR  
 2. 出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置
在搜索栏的下面,提供的各种查找方式,可以选择芯片内核、型号等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32F407IGTx。
2. 出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置
在搜索栏的下面,提供的各种查找方式,可以选择芯片内核、型号等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32F407IGTx。
 3. 配置RCC,使用外部时钟源
3. 配置RCC,使用外部时钟源
 4. 配置调试引脚
4. 配置调试引脚
 5. 将LED对应的3个引脚(PI5,PI6,PI7)设置为GPIO_Output
5. 将LED对应的3个引脚(PI5,PI6,PI7)设置为GPIO_Output
 6. 引脚模式配置
6. 引脚模式配置
 7. 配置ADC引脚
7. 配置ADC引脚
 
 8. 配置UART
8. 配置UART
 9. 时钟源设置,选择外部高速时钟源,配置为最大主频
9. 时钟源设置,选择外部高速时钟源,配置为最大主频
 10. 工程文件的设置, 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可  IDE我们使用的是 MDK5
10. 工程文件的设置, 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可  IDE我们使用的是 MDK5
 11. 点击Code Generator,进行进一步配置
11. 点击Code Generator,进行进一步配置
 
自行选择方式即可
12. 然后点击GENERATE CODE  创建工程
 创建成功,打开工程。
创建成功,打开工程。
int main(void) { int i; HAL_Init(); SystemClock_Config(); //配置系统时钟 MX_GPIO_Init(); //初始化所有已配置的外围设备 MX_ADC1_Init(); MX_ADC3_Init(); MX_UART4_Init(); LED_RED_ON; //红灯亮 while (1) { //ADC监控电源 for(i = 0;i < 100000;i++); for(i = 0;i < 5;i++){ adc.read(i); } uart4.printf("\x0c"); //清屏 uart4.printf("\033[1;32;40m");//字体终端设置为绿色 uart4.printf("\r\n\r\nhello! I am iCore3!\r\n\r\n\r\n"); //在串口终端打印“Hello! I am iCore3” //打印系统供电电压 uart4.printf(" [V] %4.2fV\r\n",adc1_3.value[0]*6); uart4.printf(" [I] %3.0fmA\r\n",adc1_3.value[1] / 2* 1000); uart4.printf(" [1.2V] %4.2fV\r\n",adc1_3.value[2]); uart4.printf(" [3.3V] %4.2fV\r\n",adc1_3.value[3] * 2); uart4.printf(" [2.5V] %4 } }
ADC_HandleTypeDef hadc1; ADC_HandleTypeDef hadc3;
typedef struct { ADC__TypeDef *Instance; //ADC寄存器基地址 ADC_InitTypeDef Init; //ADC所需参数 __IO uint32_t NbrOfCurrentConversionRank; //当前转换列的ADC数 DMA_HandleTypeDef *DMA_Handle; //指针DMA处理程序 HAL_LockTypeDef Lock; //锁定对象 __IO uint32_t State; //ADC通信状态 __IO uint32_t ErrorCode; //ADC错误代码 } ADC_HandleTypeDef;
typedef struct { uint32_t Channel; //指定要配置为ADC常规组的通道。 uint32_t Rank; //指定常规组序列器中的列组,此参数必须是介于Min Data=1和Max Data=16之间的数字 uint32_t SamplingTime; //要为选定通道设置的采样时间值。 uint32_t Offset; //保留供将来使用,可设置为0 }ADC_ChannelConfTypeDef;
HAL_StatusTypeDef HAL_ADC_ConfigChannel (ADC_HandleTypeDef* hadc, ADC_ChannelConfTypeDef* sConfig)
HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length)
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc)
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)
void HAL_ADC_IRQHandler(ADC_HandleTypeDef* hadc)
void sort(unsigned short int a[], int n) { int i, j, t; //元素从大到小排列 for (i = 0; i < n - 1; i++) { for (j = 0; j < n - i - 1; j++) { if (a[j] > a[j + 1]) { t = a[j]; a[j] = a[j + 1]; a[j + 1] = t; } } } } static int read_adc(int channel) { int i,k; unsigned long int temp[20] = {0}; unsigned long int value; unsigned short int data[100]; ADC_ChannelConfTypeDef channel_config; unsigned char channel_remap[5] = {ADC_CHANNEL_14,ADC_CHANNEL_15,ADC_CHANNEL_15,ADC_CHANNEL_4,ADC_CHANNEL_5}; //取得到的100个转换值的中间的20个的平均值作为结果 //连续取20次这样的平均值,再求平均值作为最终结果 channel_config.Channel = channel_remap[channel]; channel_config.Rank = 1; channel_config.SamplingTime = ADC_SAMPLETIME_3CYCLES; if(channel == 0 || channel == 1){ HAL_ADC_ConfigChannel(&hadc1,&channel_config); }else { HAL_ADC_ConfigChannel(&hadc3,&channel_config); } for(k = 0;k < 20;k++){ //取20组数值做滤波 for(i = 0;i < 100;i++){ if(channel == 0 || channel == 1){ HAL_ADC_Start(&hadc1); //开启ADC1采集通道 while(!__HAL_ADC_GET_FLAG(&hadc1,ADC_FLAG_EOC));//等待转换结束 data[i] = HAL_ADC_GetValue(&hadc1); //将结果保存 }else { HAL_ADC_Start(&hadc3); //开启ADC3采集通道 while(!__HAL_ADC_GET_FLAG(&hadc3,ADC_FLAG_EOC));//等待转换结束 data[i] = HAL_ADC_GetValue(&hadc3); //将结果保存 } } sort(data,100); for(i = 40;i < 60;i++){ // 对采集到的数值做均值滤波处理 temp[k] += data[i]; } temp[k] = temp[k] / 20; } value = 0; for(k = 0;k < 20;k++){ value += temp[k]; } value /= 20; adc13.value[channel] = value * ADC_REF / 4096; //12位的ADC满量程为2^12=4096,参考电压ADC_REF 为2.483V return value; }
1、把仿真器与iCore3的SWD调试口相连(直接相连或者通过转接器相连); 2、把iCore3通过Micro USB线与计算机相连,为iCore3供电; 3、打开putty软件,从设备管理器内查看端口号,设置波特率为115200;
{{ :icore3:icore3_arm_hal_10_5.png?direct |}}
4、点击Open; 5、打开Keil MDK 开发环境,并打开本实验工程; 6、烧写程序到iCore3上;