打印
[DemoCode下载]

八月新唐+ADC数据采集以及串口数据显示

[复制链接]
2584|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
5574293|  楼主 | 2017-8-22 19:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
首先附上图

这个呢就是能看到的串口打印
“八月,新唐你好”
“Hello,21ic.com!”
下面是打印输出的ADC采集的数据。



然后是使用的板子,板子是NUC131板子。


下面附上代码 :
程序很简单。只是用了简单的UART发送,以及ADC采集。
打印文字的时候,将需要打印的文字利用Printf输出。
输出ADC数据的时候就用简单的串口输出数据即可。
例程都是NUC131BSP里面的例程,只进行了数据的处理和简单的修改。
程序大致步骤是时钟设置——串口初始化——ADC初始化——数据处理。
ADC采集数据是用了定时器来进行开启的。
希望大家共同学习共同进步。
小小例程仅供参考。

#include <stdio.h>
#include "NUC131.h"
#define PLL_CLOCK   50000000
#define RXBUFSIZE   1024
#define ADC_BUFFER_LONG        64
#define COM_BUFFER_LONG        256
struct ADC_DATA{
                int16_t Buffer[6][ADC_BUFFER_LONG];
                uint8_t Count[6];
                uint8_t Start_Conv;
                uint8_t Conv_Finish;
}ADC_Data;
struct COM_DATA{
        uint8_t Buffer[COM_BUFFER_LONG];
        uint8_t Rece_Count;
        uint8_t Send_Long;
        uint8_t Send_Mack;
        uint8_t Send_Count;
}COM_Data;
struct SYS_TIME{
        uint16_t Time_1s_count;
}SYS_Time;
uint8_t g_u8RecData[RXBUFSIZE]  = {0};
volatile uint32_t g_u32comRbytes = 0;
volatile uint32_t g_u32comRhead  = 0;
volatile uint32_t g_u32comRtail  = 0;
volatile int32_t g_bWait         = TRUE;
int32_t main(void);
void UART_TEST_HANDLE(void);
void UART_FunctionTest(void);
void ADC_Init(void);
void ADC_DATA_Send_Pro(void);
void SYS_Init(void)
{
    CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);
    CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);
    CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));
    CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);
    CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);
    CLK_SetCoreClock(PLL_CLOCK);
    CLK_EnableModuleClock(UART0_MODULE);
    CLK_EnableModuleClock(TMR0_MODULE);
    CLK_EnableModuleClock(ADC_MODULE);
    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));
CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0_S_HXT, 0);       
    CLK_SetModuleClock(ADC_MODULE, CLK_CLKSEL1_ADC_S_HIRC, CLK_CLKDIV_ADC(7));
    SYS->GPB_MFP &= ~(SYS_GPB_MFP_PB0_Msk | SYS_GPB_MFP_PB1_Msk);
    SYS->GPB_MFP |= SYS_GPB_MFP_PB0_UART0_RXD | SYS_GPB_MFP_PB1_UART0_TXD;
        SYS->GPA_MFP |= SYS_GPA_MFP_PA0_ADC0;
}
void UART0_Init()
{
    SYS_ResetModule(UART0_RST);
    UART_Open(UART0, 9600);
}
void ADC_Init(void)
{
                ADC_Open(ADC, ADC_ADCR_DIFFEN_SINGLE_END, ADC_ADCR_ADMD_SINGLE_CYCLE, BIT0);
                ADC_POWER_ON(ADC);
                ADC_CLR_INT_FLAG(ADC, ADC_ADF_INT);
                ADC_START_CONV(ADC);
}
int main(void)
{
    SYS_UnlockReg();
   SYS_Init();
    /* Lock protected registers */
    SYS_LockReg();

    /* Init UART0 for printf and testing */
    UART0_Init();
TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 3200);
    TIMER_EnableInt(TIMER0);
NVIC_EnableIRQ(TMR0_IRQn);
                TIMER_Start(TIMER0);
                ADC_Init();
                GPIO_SetMode(PB, BIT13, GPIO_PMD_OUTPUT);
    /* UART sample function */
//                                                    printf(“八月,新唐你好!");
//                                                        printf("Hello, 21ic.com !");
//                                                        printf("ADC test:");
//                                                        printf("MyID:5574293");
    UART_FunctionTest();               
    while(1);

}
void TMR0_IRQHandler(void)
{
    if(TIMER_GetIntFlag(TIMER0) == 1)
    {
        TIMER_ClearIntFlag(TIMER0);
                        if(ADC_Data.Start_Conv){
                                ADC_Data.Buffer[0][ADC_Data.Count[0]++] = ADC_GET_CONVERSION_DATA(ADC, 0);;
                                ADC_START_CONV(ADC);
                                if(ADC_Data.Count[0]>=ADC_BUFFER_LONG){
                                        ADC_Data.Start_Conv = 0;
                                        ADC_Data.Conv_Finish = 1;
                                        ADC_DATA_Send_Pro();
                                }
                        }                 
                        if(SYS_Time.Time_1s_count < 3200) SYS_Time.Time_1s_count++;
                        else {
                                SYS_Time.Time_1s_count = 0;
                                ADC_Data.Start_Conv = 1;
                                ADC_Data.Count[0] = 0;
                                ADC_START_CONV(ADC);
                        }
    }
}
void ADC_DATA_Send_Pro(void)
{
                uint8_t Temp_i;
                for(Temp_i = 0; Temp_i < ADC_BUFFER_LONG;Temp_i ++ )
                {
                                COM_Data.Buffer[Temp_i*2+0] = (uint8_t)(ADC_Data.Buffer[0][Temp_i] >> 8);
                }
                COM_Data.Send_Long = 128;
                COM_Data.Send_Mack = 1;
}
void UART02_IRQHandler(void)
{
    UART_TEST_HANDLE();
}

void UART_TEST_HANDLE()
{
    uint32_t u32IntSts = UART0->ISR;
    if(u32IntSts & UART_ISR_RDA_INT_Msk)
    {
        while(UART_IS_RX_READY(UART0))
        {
                                                COM_Data.Buffer[COM_Data.Rece_Count++] = UART_READ(UART0);                                                               
        }
                                if(COM_Data.Buffer[0] == 0x01 )
                                {
                                        uint8_t Temp_i;
                                        for(Temp_i = 0; Temp_i < ADC_BUFFER_LONG;Temp_i ++ )
                                        {
                                                        COM_Data.Buffer[Temp_i*2+0] = (uint8_t)(ADC_Data.Buffer[0][Temp_i] >> 8);
                                        }
                                        COM_Data.Send_Long = 128;
                                }
    }
                if(COM_Data.Send_Mack){
                                if(COM_Data.Send_Long>COM_Data.Send_Count){
                                                UART_WRITE(UART0, COM_Data.Buffer[COM_Data.Send_Count]);
                                }else {
                                        COM_Data.Send_Mack = 0;       
                                }
                }
}
void UART_FunctionTest()
{
    UART_EnableInt(UART0, (UART_IER_RDA_IEN_Msk | UART_IER_THRE_IEN_Msk | UART_IER_TOUT_IEN_Msk));
    while(g_bWait);
    UART_DisableInt(UART0, (UART_IER_RDA_IEN_Msk | UART_IER_THRE_IEN_Msk | UART_IER_TOUT_IEN_Msk));
    g_bWait = TRUE;
}


沙发
5574293|  楼主 | 2017-8-22 19:22 | 只看该作者
自己顶一下

使用特权

评论回复
板凳
gaoyang9992006| | 2017-8-24 17:45 | 只看该作者
不错,我帮你顶一个。

使用特权

评论回复
地板
捉虫天师| | 2017-8-24 17:45 | 只看该作者
好贴,学习学习。

使用特权

评论回复
5
wanduzi| | 2017-8-24 20:55 | 只看该作者
楼主你测试的什么,糊弄啊。哈哈哈

使用特权

评论回复
6
wanduzi| | 2017-8-24 20:56 | 只看该作者
没有输出任何外设测试的打印信息啊。。

使用特权

评论回复
7
5574293|  楼主 | 2017-8-25 08:45 | 只看该作者
wanduzi 发表于 2017-8-24 20:55
楼主你测试的什么,糊弄啊。哈哈哈

就是AD采集的数据呀  输出的十六进制数据而已

使用特权

评论回复
8
5574293|  楼主 | 2017-8-25 08:47 | 只看该作者
wanduzi 发表于 2017-8-24 20:56
没有输出任何外设测试的打印信息啊。。

输出数据有个图片你看不了吗?

使用特权

评论回复
9
5574293|  楼主 | 2017-8-25 08:48 | 只看该作者
gaoyang9992006 发表于 2017-8-24 17:45
不错,我帮你顶一个。

谢谢

使用特权

评论回复
10
598330983| | 2017-8-26 11:21 | 只看该作者
131的板子风格跟其他的不是一样啊

使用特权

评论回复
11
xiaoyu1126| | 2017-8-29 16:56 | 只看该作者
楼主,有没有做过nano102sc2an这个单片机的程序,自己在使用芯片内部的EEPROM的时候有些不明白,楼主提供一下参考的程序或者解决方案呗

使用特权

评论回复
12
5574293|  楼主 | 2017-8-30 08:18 | 只看该作者
xiaoyu1126 发表于 2017-8-29 16:56
楼主,有没有做过nano102sc2an这个单片机的程序,自己在使用芯片内部的EEPROM的时候有些不明白,楼主提供一 ...

你那个芯片我没用过,但是NUC131的我用过  NUV131的EEPROM 实际上是芯片内部自带的data flash ,这个data flash 就可以当EEPROM来使用。使用的时候,它提供的参考程序里面可以找到有关FMC的程序,你或者FMC.H里面也有关于dataflash的函数,那个函数就可以供你在程序里面直接调用 。有擦除,读取,以及写功能。
NUC131使用时,就需要注意先擦除,在进行读写操作就行了。
NUC131的操作方式是这样的  。如果芯片都是新唐的话,我觉得大致方法差不多,就有些细节需要你自己去注意下。

使用特权

评论回复
13
5574293|  楼主 | 2017-8-30 08:19 | 只看该作者
598330983 发表于 2017-8-26 11:21
131的板子风格跟其他的不是一样啊

我目前还只接触过131和029,这两个差不多的 。不知道其他的怎么样

使用特权

评论回复
14
zzfd97| | 2018-4-3 19:22 | 只看该作者
谢谢分享!!!

使用特权

评论回复
15
呵呵呵囧行| | 2018-6-22 17:13 | 只看该作者
用了你的在n76e003上  报错

使用特权

评论回复
16
5574293|  楼主 | 2018-6-25 10:35 | 只看该作者
呵呵呵囧行 发表于 2018-6-22 17:13
用了你的在n76e003上  报错

哪里报错了  ?

使用特权

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

本版积分规则

15

主题

166

帖子

1

粉丝