完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
新唐官方提供了Direct-register-access方法也就是寄存器直接赋值的方法进行A/D也就是驱动ADC的例程,那个例程可以在Keil for ARM中直接编译,也可直接运行。作者把例程移植到EmBITZ1.0中,并成功运行,主要修改为:
1)修改了启动文件startup.s,按照新唐官方文件增加了M0516外部中断表 2)修改了配置文件gcc_arm.ld, 3)使用syscalls.c替代了常见的retarget.c串口重定向文件,实现了UART0的输出 4)在UART.h中增加了一个void Send_Sting_To_PC (char *s)字符串输出函数,此函数实现在UART.c中,通过反复调用void Send_Data_To_PC (char c)函数实现字符串的输出。同时,在UART.h中增加了一个BaudRate变量 #define BaudRate 115200,可以方便修改串口波特率 5)编译后下载到NuTiny-EVB-M051_V3.0开发板中,通过USB/TTL连接计算机,并运行任一串口监视软件,就可以看到转换结果了 如何修改配置文件和启动文件,如何建立工程,如何增加新唐ARM,请见作者其他技术帖子。 原向导生成的LPC1114相关文件未删除,可以直接删除。 |
|
相关推荐
1个回答
|
|
此处建议提供完整的代码和详细说明,方便读者学习参考。以下是一个简单的A/D转换示例:
1. 首先在EmBITZ1.0中创建一个新工程,并将设备选为M0516LDN。创建完毕后,可以在工程文件夹下找到startup.s和gcc_arm.ld文件,分别对应启动文件和配置文件。 2. 在startup.s文件中添加以下代码,用于定义外部中断向量表: .extern ADC_IRQHandler .section .isr_vector,"a",%progbits vector_table: .long _estack .long Reset_Handler .long NMI_Handler .long HardFault_Handler .long 0 .long 0 .long 0 .long 0 .long 0 .long 0 .long 0 .long SVC_Handler .long 0 .long 0 .long PendSV_Handler .long SysTick_Handler .long ADC_IRQHandler .section .text,"ax",%progbits 3. 在gcc_arm.ld文件中添加以下代码,用于定义内存和Flash的起始地址和大小: MEMORY { ram (rwx) : ORIGIN = 0x20000000, LENGTH = 8K rom (rx) : ORIGIN = 0, LENGTH = 64K } /* Sections */ SECTIONS { .isr_vector : { KEEP(*(.isr_vector)) } >rom /* Program code */ .text : { *(.text) *(.text.*) *(.rodata) } >rom /* Initialized data */ .data : { *(.data) *(.data.*) *(.sram) } >ram /* Uninitialized data */ .bss : { *(.bss) *(.bss.*) *(COMMON) } >ram /* Heap and stack */ _heap = .; .heap : { . = ALIGN(4); _end_of_heap = .; } >ram _stack = ORIGIN(ram) + LENGTH(ram); } 4. 创建一个名为adc.c的文件,并添加以下代码,用于配置和启动A/D转换: #include "M0516.h" void ADC_Init(void) { SYSCLK->APBCLK |= SYSCLK_APBCLK_ADC_EN_Msk; // enable ADC clock ADC->CR = ADC_CR_ADCEN_Msk | ADC_CR_ADMD_SINGLE; // enable ADC and set to single mode ADC->CHSEL = 0x1F; // select channel 31 (PA7) } int ADC_Read(void) { ADC->CR |= ADC_CR_ADST_Msk; // start ADC conversion while (ADC->CR & ADC_CR_ADST_Msk); // wait for conversion to complete return ADC->DR[0] & 0xFFF; // return converted value (12-bit) } 5. 在main.c文件中添加以下代码,用于初始化串口和A/D转换,并实现循环读取A/D值并输出到串口: #include #include "M0516.h" #include "uart.h" #include "adc.h" int main() { char str[20]; int value; UART_Init(); ADC_Init(); while (1) { value = ADC_Read(); sprintf(str, "A/D value: %drn", value); Send_String_To_PC(str); } return 0; } 6. 最后,在uart.c文件中添加以下代码,用于定义字符串输出函数Send_String_To_PC(): #include "uart.h" void Send_String_To_PC(char *s) { while (*s) { Send_Data_To_PC(*s++); } } 至此,A/D转换的代码已经完成,可以通过串口接收并输出转换结果了。注意,以上代码仅供参考,实际应用中还需要根据具体情况进行修改和优化。 |
|
|
|
只有小组成员才能发言,加入小组>>
820 浏览 0 评论
1162 浏览 1 评论
2537 浏览 5 评论
2872 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2722 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1127浏览 3评论
199浏览 2评论
465浏览 2评论
382浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
464浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-31 04:25 , Processed in 1.092052 second(s), Total 81, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号