对于Mini-G0001开发板,它配有较为丰富的例程可供大家学习和借鉴,但稍感不足的是其说明文档readme.txt ,其基本内容如下:
@par Tool
MM32-LINK MINI(CMSIS-DAP)
* If J-LINK is used, you should change console uart config in platform.c !!!
@par How to use it ?
1.Connect MM32 MiniBoard to the computer through MM32-LINK MINI
2.Open serial terminal software
3.Build project
4.Download program
5.View run results
@note
缺少实际的说明和指导意义,且与例程的关联性较弱。
下面以例程ADC_AnyChannel_OneCycleScan_Polling加以介绍和测试,该例程的主程序为:
int main(void)
{
PLATFORM_Init();
ADC_AnyChannel_OneCycleScan_Polling_Sample();
while (1)
{
}
}
复制代码要想了解它的功能和用法就必须去查看函数PLATFORM_Init()和ADC_AnyChannel_OneCycleScan_Polling_Sample(),其中函数PLATFORM_Init()的内容为:
void PLATFORM_Init(void)
{
PLATFORM_InitDelay();
PLATFORM_InitLED();
PLATFORM_InitConsole(115200);
}
复制代码也就是说它解决了延时、LED及串口的初始化问题,具体使用到哪些引脚则需要进行对相关函数进行分析。
其中涉及的函数PLATFORM_InitLED()和PLATFORM_InitConsole()的内容如下:
void PLATFORM_InitLED(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
PLATFORM_LED_Enable(LED1, DISABLE);
PLATFORM_LED_Enable(LED2, DISABLE);
PLATFORM_LED_Enable(LED3, DISABLE);
PLATFORM_LED_Enable(LED4, DISABLE);
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_10 | GPIO_Pin_15;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
复制代码void PLATFORM_InitConsole(uint32_t Baudrate)
{
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1ENR_USART1, ENABLE);
USART_StructInit(&USART_InitStruct);
USART_InitStruct.USART_BaudRate = Baudrate;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_Mode = USART_Mode_Tx;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(USART1, &USART_InitStruct);
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_4);
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
USART_Cmd(USART1, ENABLE);
}
复制代码也就是说要用到如下的引脚:
LD1---PA15
LD2---PA10
LD3---PA6
LD4---PA5
TXD1 ---PA10
这就出现了引脚PA10被 分配了2种功能,就在程序的运行中导致先定义的功能被覆盖而失去作用。
另外得到的结论是要,将PA10接到串口模块的RXD引脚才开观察到测试结果,而串行通讯的波特率为115200bps。
图1 引脚分配图
此外,通过对函数ADC_AnyChannel_OneCycleScan_Polling_Sample()的查看可知,其功能是对3个ADC采集通道进行数据检测,并转换为电压来显示,其具体内容为:
void ADC_AnyChannel_OneCycleScan_Polling_Sample(void)
{
float RVxVoltage[3];
printf("\r\nTest %s", __FUNCTION__);
ADC_Configure();
while (1)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while (RESET == ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC))
{
}
ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
RVxVoltage[0] = (float)ADC_GetChannelConvertedValue(ADC1, ADC_Channel_3) * (float)3.3 / (float)4096.0;
RVxVoltage[1] = (float)ADC_GetChannelConvertedValue(ADC1, ADC_Channel_1) * (float)3.3 / (float)4096.0;
RVxVoltage[2] = (float)ADC_GetChannelConvertedValue(ADC1, ADC_Channel_7) * (float)3.3 / (float)4096.0;
printf("\r\nRV1 Voltage = %0.2f \tRV2 Voltage = %0.2f \tRV3 Voltage = %0.2f", RVxVoltage[0], RVxVoltage[1], RVxVoltage[2]);
}
}
复制代码再通过函数ADC_Configure()可知,它使用的引脚为:
PA7--- ADC1_IN7
PA12--- ADC1_IN4
PB0---ADC1_IN6
函数ADC_Configure()的内容为:
void ADC_Configure(void)
{
ADC_InitTypeDef ADC_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1ENR_ADC1, ENABLE);
ADC_StructInit(&ADC_InitStruct);
ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStruct.ADC_PRESCARE = ADC_PCLK1_PRESCARE_16;
ADC_InitStruct.ADC_Mode = ADC_Mode_Scan;
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
ADC_Init(ADC1, &ADC_InitStruct);
ADC_SampleTimeConfig(ADC1, ADC_Samctl_240_5);
ADC_ANY_NUM_Config(ADC1, 2);
ADC_ANY_CH_Config(ADC1, 0, ADC_Channel_3);
ADC_ANY_CH_Config(ADC1, 1, ADC_Channel_1);
ADC_ANY_CH_Config(ADC1, 2, ADC_Channel_7);
ADC_ANY_Cmd(ADC1, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOB, ENABLE);
/* PA12(RV1) PB0(RV2) PA7(RV3) */
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_12;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOB, &GPIO_InitStruct);
ADC_Cmd(ADC1, ENABLE);
}
复制代码结合图2的 ADC检测电路可以,通过通过板载的3个可变电阻器即可改变相应的检测电压。
图2 ADC检测电路
在弄清这些情况后,就可获得正常的检测效果,因此为例程配备有效的readme文档是十分必要的,能指导使用者开始地了解其功能和用法。
图3 ADC检测电路