本帖最后由 jinglixixi_457498010 于 2023-10-18 10:35 编辑

对于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
    image.png
    1 引脚分配图

    此外,通过对函数ADC_AnyChannel_OneCycleScan_Polling_Sample()的查看可知其功能是对3ADC采集通道进行数据检测,并转换为电压来显示,其具体内容为:
    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);
  • }
  • 复制代码
    结合图2ADC检测电路可以,通过通过板载的3个可变电阻器即可改变相应的检测电压。
    image.png
    2  ADC检测电路

    在弄清这些情况后,就可获得正常的检测效果,因此为例程配备有效的readme文档是十分必要的能指导使用者开始地了解其功能和用法
    image.png
    3  ADC检测电路