打印
[MM32软件]

【MM32 eMiniBoard测评报告】

[复制链接]
1560|38
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 一路向北lm 于 2020-5-3 22:32 编辑

汇总如下:0.  开箱,让你一次看个够
1.安装mm32_devkit_set
2.LED、串口2、ADC测试
3.移植RT-Thread 到MM32L0平台
4.测试RT-Thread 的kprintf




0.  开箱,让你一次看个够










使用特权

评论回复
沙发
一路向北lm|  楼主 | 2020-4-21 17:11 | 只看该作者
本帖最后由 一路向北lm 于 2020-5-3 22:31 编辑

1.安装mm32_devkit_setup
为什么要安装mm32_devkit_setup?肯定是使用keil MDK的时候可以直接使用MM32-Link啊!
安装需要以管理员的身份运行(win7),据听说有的同学没有以管理员身份运行导致MM32-Link不可以使用。




使用特权

评论回复
板凳
一路向北lm|  楼主 | 2020-4-21 17:12 | 只看该作者
本帖最后由 一路向北lm 于 2020-4-21 17:13 编辑

安装完成后,MM32-LinK轻松使用!


使用特权

评论回复
地板
一路向北lm|  楼主 | 2020-4-21 17:16 | 只看该作者
2. LED、串口、ADC测试
先来LED测试,不废话,直接上代码,官方也太不走心了,明明要点亮LED1LED2,为啥LED3LED4亮了,是不是PCB丝印打错了……………………
int main(void)
{
    delay_init();
    LED_Init();
while(1)
{
                        LED1_ON();
                        LED2_ON();
    }
}


使用特权

评论回复
5
一路向北lm|  楼主 | 2020-4-21 17:19 | 只看该作者
修改一下引脚,好了,这样才对嘛!
//修改前:
#define LED1_Port  GPIOB
#define LED1_Pin   GPIO_Pin_5
#define LED2_Port  GPIOB
#define LED2_Pin   GPIO_Pin_4
#define LED3_Port  GPIOB
#define LED3_Pin   GPIO_Pin_3
#define LED4_Port  GPIOA
#define LED4_Pin   GPIO_Pin_15

//修改后:
#define LED1_Port  GPIOA
#define LED1_Pin   GPIO_Pin_15
#define LED2_Port  GPIOB
#define LED2_Pin   GPIO_Pin_3
#define LED3_Port  GPIOB
#define LED3_Pin   GPIO_Pin_4
#define LED4_Port  GPIOB
#define LED4_Pin   GPIO_Pin_5

使用特权

评论回复
6
一路向北lm|  楼主 | 2020-4-22 11:47 | 只看该作者
再来串口测试,注意CN4引出的串口时串口2,初始化串口2代码如下:
void UartInit_Loop(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    UART_InitTypeDef UART_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART2, ENABLE);
    CFG_GPIO_Clock(GPIOA, ENABLE);

    GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);
    UART_StructInit(&UART_InitStructure);
    UART_InitStructure.BaudRate = 115200;
    //The word length is in 8-bit data format.
    UART_InitStructure.WordLength = UART_WordLength_8b;
    UART_InitStructure.StopBits = UART_StopBits_1;
    //No even check bit.
    UART_InitStructure.Parity = UART_Parity_No;
    //No hardware data flow control.
    UART_InitStructure.HWFlowControl = UART_HWFlowControl_None;
    UART_InitStructure.Mode = UART_Mode_Rx | UART_Mode_Tx;

    UART_Init(UART2, &UART_InitStructure);
    UART_Cmd(UART2, ENABLE);

    //UART2_TX   GPIOA.2
    GPIO_StructInit(&GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //UART2_RX    GPIOA.3
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    UartSendGroup((u8*)printBuf, sprintf(printBuf, "UART OK!\r\n"));
}


使用特权

评论回复
7
一路向北lm|  楼主 | 2020-4-22 11:48 | 只看该作者
串口2的发送数据函数
//发送字符串函数
void UartSendGroup(u8* buf, u16 len)
{
    while(len--)
        UartSendByte(*buf++);
}

//发送字节函数
void UartSendByte(u8 dat)
{
    UART_SendData(UART2, dat);
    while(!UART_GetFlagStatus(UART2, UART_FLAG_TXEPT));
}


使用特权

评论回复
8
一路向北lm|  楼主 | 2020-4-22 11:49 | 只看该作者
接上串口线,开始测试

使用特权

评论回复
9
一路向北lm|  楼主 | 2020-4-22 11:49 | 只看该作者
已经可以打印数据啦…..

使用特权

评论回复
10
一路向北lm|  楼主 | 2020-4-27 14:28 | 只看该作者
本帖最后由 一路向北lm 于 2020-4-28 16:43 编辑

调试完串口,下面开始测试ADC 啦!
ADC初始化函数如下:
//使能ADC1的时钟
void ADC_RCC_ClockSet(ADC_TypeDef* ADCx, FunctionalState NewState)
{

    if(ADCx == ADC1)
          {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);                  
     }
}
//
static void ADCxSampleTimeConfig(ADC_TypeDef* ADCn, ADCSAM_TypeDef sampleTime)
{
    ADCn->CFGR &= ~ADC_CFGR_SAMCTL;
    ADCn->CFGR |= sampleTime;
}
//ADC1外设初始化
void ADC1BasicConfigWithParameter(void)
{
    ADC_InitTypeDef  ADC_InitStructure;
    ADC_TypeDef* ADCn;
    ADCn = ADC1;
    ADC_StructInit(&ADC_InitStructure);

    ADC_RCC_ClockSet(ADCn,ENABLE);                                                

    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    ADC_InitStructure.ADC_PRESCARE=ADC_PCLK2_PRESCARE_16;                     //ADC prescale factor
    ADC_InitStructure.ADC_Mode=ADC_Mode_Continue;                             //Set ADC mode to continuous conversion mode
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                     
//AD data right-justified
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
    ADC_Init(ADCn, &ADC_InitStructure);
    ADCxSampleTimeConfig(ADCn, ADC_Samctl_13_5);
    ADC_Cmd(ADCn,ENABLE);                                                      //Enable AD conversion
}

void ADCxChannelEnable(ADC_TypeDef* ADCn, u32 channel)
{
    ADCn->CHSR &= ~(1 << channel);
    ADCn->CHSR |=  (1 << channel);
}

void ADC1ChannelConfigWithParameter(void)
{
    ADC_TypeDef* ADCn;
    ADCn = ADC1;
    ADCxChannelEnable(ADCn, ADC_Channel_1);
//    ADCxChannelEnable(ADCn,ADC_Channel_1);
//    ADCxChannelEnable(ADCn,ADC_Channel_2);
//    ADCxChannelEnable(ADCn,ADC_Channel_3);
}


void ADCxAssignPin(GPIO_TypeDef* GPIOx, u16 pin)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_StructInit(&GPIO_InitStructure);
    CFG_GPIO_Clock(GPIOx, ENABLE);
    GPIO_InitStructure.GPIO_Pin  =  pin;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                           //Output speed
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                               //GPIO mode
    GPIO_Init(GPIOx, &GPIO_InitStructure);
}

unsigned int ADC1_SingleChannel_Get(void)
{
    u16 puiADData;
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);                                     //Software start conversion
    while(ADC_GetFlagStatus(ADC1, ADC_IT_EOC) == 0);
    ADC_ClearFlag(ADC1, ADC_IT_EOC);
    puiADData = ADC_GetConversionValue(ADC1);
    return puiADData;
}

unsigned int Get_Adc_Average(uint8_t times)
{
    u32 temp_val = 0;
    u8 t;
    u8 delay;
    for(t = 0; t < times; t++) {
        temp_val += ADC1_SingleChannel_Get();
        for(delay = 0; delay < 100; delay++);
    }
    return temp_val / times;
}

void ADC1PinConfigWithParameter(void)
{
    //customer can change below config based Pin assign
    //sample No.1
    ADCxAssignPin(GPIOA, GPIO_Pin_1);
    //ADCxAssignPin(GPIOA, GPIO_Pin_4);
    //ADCxAssignPin(GPIOA, GPIO_Pin_5);
    //sample No.2
    //ADCxAssignPin(GPIOA, GPIO_Pin_4);
    //ADCxAssignPin(GPIOA, GPIO_Pin_5);
    //ADCxAssignPin(GPIOA, GPIO_Pin_6);
}


使用特权

评论回复
11
wziyi| | 2020-4-27 18:05 | 只看该作者
不是丝印错了,是官方提供的软件是别的片子的

使用特权

评论回复
12
一路向北lm|  楼主 | 2020-4-27 21:33 | 只看该作者
wziyi 发表于 2020-4-27 18:05
不是丝印错了,是官方提供的软件是别的片子的

应该是的哈

使用特权

评论回复
13
一路向北lm|  楼主 | 2020-4-28 16:43 | 只看该作者
读取板卡上Ain0 RV1电位器ADC数据,具体·函数如下:
int main(void)
{
        unsigned int ADCVAL;
        float fValue;
    delay_init();
    LED_Init();
    UartInit_Loop();
        ADC1BasicConfigWithParameter();
    ADC1ChannelConfigWithParameter();
    ADC1PinConfigWithParameter();
    while(1)
                {
                        delay_ms(300);
            LED1_TOGGLE();
                        ADCVAL = Get_Adc_Average(5);
                        UartSendGroup((u8*)printBuf, sprintf(printBuf, "The AD value:"));
                        UartSendByte(ADCVAL%10000/1000+0x30);
                        UartSendByte(ADCVAL%1000/100+0x30);
                        UartSendByte(ADCVAL%100/10+0x30);
                        UartSendByte(ADCVAL%10+0x30);
                        UartSendByte('\n');
    }
}


使用特权

评论回复
14
一路向北lm|  楼主 | 2020-4-28 16:45 | 只看该作者
串口ADC的打印结果:


使用特权

评论回复
15
一路向北lm|  楼主 | 2020-5-3 17:55 | 只看该作者
3.移植RT-Thread到MM32L0平台
准备工作:RT-Thread 源码 MM32串口工程。
RT-Thread Nano 源码获取, Nano 去除了各种开发板的 BSP,保留了 OS 核心功能。下载地址:https://www.rt-thread.org/download/nano/rt-thread-3.1.3.zip下载好的 RT-Thread PackageRT-Thread Package 容量很小,我们直接将安装在 KEILPACK 目录下,然后将整个 RT-Thread 文件夹拷贝到我们的MM32串口工程里面。RT-Thread 文件夹目录如下:




使用特权

评论回复
16
一路向北lm|  楼主 | 2020-5-3 17:55 | 只看该作者
BSP:板级支持包;
components/finsh: RT-Thread 组件;
include: 头文件;
libcpu: 与处理器相关的接口文件;
src: RT-Thread 内核源码

使用特权

评论回复
17
一路向北lm|  楼主 | 2020-5-3 17:56 | 只看该作者
MM32串口工程上新建 RT-Thread 文件夹,并在该文件夹下新建 RT-Thread-Port、
RT-Thread-Source和 RT-Thread-Include 文件夹。

使用特权

评论回复
18
一路向北lm|  楼主 | 2020-5-3 17:57 | 只看该作者
将RT-Thread/3.1.3/src文件夹下的所有文件复制到新建的 RT-Thread-Source文件夹中。

使用特权

评论回复
19
一路向北lm|  楼主 | 2020-5-3 17:58 | 只看该作者
将路径 RT-Thread/3.1.3/libcpu/arm/cortex-m0/文件夹下的 context_rvds.S 文件和cpuport.c 文件复制到新建的 RT-Thread-Port 文件夹中。

使用特权

评论回复
20
一路向北lm|  楼主 | 2020-5-3 17:59 | 只看该作者
将路径RT-Thread\3.1.3\components\finsh 文件夹复制到新建的RT-Thread-Include 文件夹中,将路径 RT-Thread\3.1.3\include文件夹下的内容复制到新建的 RT-Thread-Include文件夹中。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

277

主题

3805

帖子

76

粉丝