打印
[MM32软件]

【MM32 eMiniBoard测评报告】开箱加点灯(寄存器+库函数)

[复制链接]
594|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 nvjwiciw659 于 2020-5-4 23:33 编辑

很幸运能有这次机会把玩一下MM32的板子,之前智能互联大赛很遗憾与MM32擦肩而过,现在我已脱离学生身份,成了一名头发渐稀的硬件开发者。这次多谢二姨家和MM32的支持,让我能进一步了解MM32这款国产片子。废话不多说,直接开箱欣赏它的美。
然后我们开始正式测试
第一:肯定是先到官网唰唰唰的下载资料咯

不管三七二十一我就是一顿下载
安装MM32-Link驱动,然后我们就可以用板载Link下载程序了
安装芯片包
第二:打开led程序

这时候翻出我们的电路图
打开程序
可以发现电路图中的LED和程序中的1234顺序是反着的,不影响,我们继续
编译下载一气呵成,就能看到四个灯在向我眨眼睛。
以上是寄存器的版本,下面我们看看库函数的版本

还是库函数比较适合傻傻的我,先库函数配置,然后debug看寄存器,注释库函数,改成寄存器,不知道有没有和我一样的老哥呢?
(十天前就已经编辑好了,只差插入图片了,由于新手的原因,插图频频出错,12点之后没能上传,一下子拖了十天,趁五一赶紧搞咯!)
顺便祝大家青年节快乐!

使用特权

评论回复
沙发
nvjwiciw659|  楼主 | 2020-5-5 22:52 | 只看该作者
本帖最后由 nvjwiciw659 于 2020-5-5 22:54 编辑

二姨家RTT活动也在进行中,看到我的大师兄在移植RTT_nano,而我个菜**只能直接用RTTsdk包里的开始,不过驱动比较少,进去看了看只有串口
不过差不多也够用,进去测试一下子,来个经典的点灯
static rt_thread_t led0_thread = RT_NULL;
static rt_thread_t led1_thread = RT_NULL;
/********************************************************************************************************
* led_init(void)
********************************************************************************************************/
void led_init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
                RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
    GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
                GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_3;
                GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/********************************************************************************************************
* led0_thread_entry(void)LED0任务初始化
********************************************************************************************************/
static void led0_thread_entry(void* parameter)
{        
    while (1)
    {
        GPIO_SetBits(GPIOA, GPIO_Pin_15);
        rt_thread_delay(500);   /* 延时500个tick */
        rt_kprintf("led0_thread running,LED1_ON\r\n");
        
        GPIO_ResetBits(GPIOA, GPIO_Pin_15);   
        rt_thread_delay(500);   /* 延时500个tick */                                 
        rt_kprintf("led0_thread running,LED1_OFF\r\n");
    }
}
/********************************************************************************************************
* led1_thread_entry(void)LED1任务初始化
********************************************************************************************************/
static void led1_thread_entry(void* parameter)
{        
    while (1)
    {
        GPIO_SetBits(GPIOB, GPIO_Pin_3);
        rt_thread_delay(1000);   /* 延时1000个tick */
        rt_kprintf("led1_thread running,LED1_ON\r\n");
        
        GPIO_ResetBits(GPIOB, GPIO_Pin_3);   
        rt_thread_delay(1000);   /* 延时1000个tick */                                 
        rt_kprintf("led1_thread running,LED1_OFF\r\n");
    }
}
/********************************************************************************************************
* led0_task(void)LED0任务
********************************************************************************************************/
void led0_task(void)
{
        led0_thread =                          /* 线程控制块指针 */
    rt_thread_create( "led0",              /* 线程名字 */
                      led0_thread_entry,   /* 线程入口函数 */
                      RT_NULL,             /* 线程入口函数参数 */
                      512,                 /* 线程栈大小 */
                      2,                   /* 线程的优先级 */
                      20);                 /* 线程时间片 */
                  
    /* 启动线程,开启调度 */
   if (led0_thread != RT_NULL)
        rt_thread_startup(led0_thread);
}
/********************************************************************************************************
* led1_task(void)LED1任务
********************************************************************************************************/
void led1_task(void)
{
        led1_thread =                          /* 线程控制块指针 */
    rt_thread_create( "led1",              /* 线程名字 */
                      led1_thread_entry,   /* 线程入口函数 */
                      RT_NULL,             /* 线程入口函数参数 */
                      512,                 /* 线程栈大小 */
                      3,                   /* 线程的优先级 */
                      20);                 /* 线程时间片 */
                  
    /* 启动线程,开启调度 */
   if (led1_thread != RT_NULL)
        rt_thread_startup(led1_thread);
}

int main(void)
{
    led_init();
                led0_task();
                led1_task();
    while (1)
    {

    }
}


使用特权

评论回复
板凳
nvjwiciw659|  楼主 | 2020-5-5 23:16 | 只看该作者
本帖最后由 nvjwiciw659 于 2020-5-5 23:20 编辑

接下来试试ADC采集
static rt_thread_t adc_thread = RT_NULL;
static rt_thread_t printf_thread = RT_NULL;

#define DISABLE_ALL_CHANNEL     9

__IO uint16_t ADCVAL;
int fValue;

void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);   
   
    GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_1|GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    /*将PA1配置为模拟输入*/
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

/********************************************************************************************************
**函数信息 :void ADC1_SingleChannel(uint8_t ADC_Channel_x)      
**功能描述 :配置ADC1单次转换模式
**输入参数 :ADC_Channel_x , x为0~8
**输出参数 :无
**    备注 :
********************************************************************************************************/
void ADC1_SingleChannel(uint8_t ADC_Channel_x)
{
    ADC_InitTypeDef  ADC_InitStructure;
   
    GPIO_Configuration();
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
   
    /* Initialize the ADC_PRESCARE values */
    ADC_InitStructure.ADC_PRESCARE = ADC_PCLK2_PRESCARE_16;
    /* Initialize the ADC_Mode member */
    ADC_InitStructure.ADC_Mode = ADC_Mode_Single;
    /* Initialize the ADC_ContinuousConvMode member */
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    /* Initialize the ADC_DataAlign member */
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    /* Initialize the ADC_ExternalTrigConv member */
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    ADC_Init(ADC1, &ADC_InitStructure);
   
    /*屏蔽所有通道*/
    ADC_RegularChannelConfig(ADC1, DISABLE_ALL_CHANNEL , 0, 0);
    /*使能选中通道,后面参数保留*/
    ADC_RegularChannelConfig(ADC1, ADC_Channel_x, 0, ADC_SampleTime_28_5Cycles);
   
    ADC_Cmd(ADC1, ENABLE);
}

/********************************************************************************************************
**函数信息 :ADC1_SingleChannel_Get()      
**功能描述 :获取ADC1转换数据
**输入参数 :ADC_Channel_x , x为0~8
*puiADData ,ADC1实际转换数据
**输出参数 :ucStatus ,0 表示数据获取失败,1 表示成功
********************************************************************************************************/
u16 ADC1_SingleChannel_Get(uint8_t ADC_Channel_x)
{
    u16 puiADData;
    /*ADCR寄存器的ADST位使能,软件启动转换*/
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==0);
    ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
    puiADData=ADC_GetConversionValue(ADC1);
    return puiADData;
}

/********************************************************************************************************
**函数信息 :Get_Adc_Average(uint8_t ADC_Channel_x,uint8_t times)     
**功能描述 :获取几次ADC1采样值的平均值
**输入参数 :ADC_Channel_x , x为0~8
**输出参数 :puiADData为ADC读到的值
********************************************************************************************************/
u16 Get_Adc_Average(uint8_t ADC_Channel_x,uint8_t times)
{
    u32 temp_val=0;
    u8 t;
    u8 delay;
    for(t=0;t<times;t++)
    {
        temp_val+=ADC1_SingleChannel_Get(ADC_Channel_x);
        for(delay=0;delay<100;delay++);
    }
    return temp_val/times;
}         

/********************************************************************************************************
* led_init(void)
********************************************************************************************************/
void led_init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
                RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
    GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void ADC_thread_entry(void* parameter)
{
        while(1)
        {
                ADCVAL=Get_Adc_Average(ADC_Channel_1,5);
    fValue = (int) (ADCVAL * 825) >> 10;
                rt_thread_delay(500);   /* 延时500个tick */
        }
}

void PRINTF_thread_entry(void* parameter)
{
        while(1)
        {
                rt_kprintf("\r\nADC1_CH_1=0x%04X\r\n",ADCVAL);
                rt_kprintf("ADC1_CH_1=%dmV\r\n",fValue);
                rt_thread_delay(500);   /* 延时500个tick */                                                
        }
}

/********************************************************************************************************
* adc_task(void)adc任务
********************************************************************************************************/
void adc_task(void)
{
        adc_thread =                          /* 线程控制块指针 */
    rt_thread_create( "adc",              /* 线程名字 */
                      ADC_thread_entry,   /* 线程入口函数 */
                      RT_NULL,             /* 线程入口函数参数 */
                      512,                 /* 线程栈大小 */
                      2,                   /* 线程的优先级 */
                      20);                 /* 线程时间片 */
                  
    /* 启动线程,开启调度 */
   if (adc_thread != RT_NULL)
        rt_thread_startup(adc_thread);
}
/********************************************************************************************************
* adc_task(void)adc任务
********************************************************************************************************/
void printf_task(void)
{
        printf_thread =                          /* 线程控制块指针 */
    rt_thread_create( "printf",              /* 线程名字 */
                      PRINTF_thread_entry,   /* 线程入口函数 */
                      RT_NULL,             /* 线程入口函数参数 */
                      512,                 /* 线程栈大小 */
                      3,                   /* 线程的优先级 */
                      20);                 /* 线程时间片 */
                  
    /* 启动线程,开启调度 */
   if (printf_thread != RT_NULL)
        rt_thread_startup(printf_thread);
}

void mmrtt_init(void)
{
        ADC1_SingleChannel( ADC_Channel_1);
        adc_task();
        printf_task();
}

int main(void)
{
    led_init();
                mmrtt_init();
    while (1)
    {

    }
}

使用特权

评论回复
地板
nawu| | 2020-6-1 16:35 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
5
qcliu| | 2020-6-1 16:36 | 只看该作者
板子很漂亮啊

使用特权

评论回复
6
tfqi| | 2020-6-1 16:36 | 只看该作者
代码是自己写的吗 很漂亮

使用特权

评论回复
7
wiba| | 2020-6-1 16:36 | 只看该作者
楼主好厉害

使用特权

评论回复
8
zljiu| | 2020-6-1 16:37 | 只看该作者
真是好羡慕楼主呀

使用特权

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

本版积分规则

13

主题

79

帖子

0

粉丝