冰楓論壇
標題:
SAMA5D28
[打印本頁]
作者:
洪嵐峰
時間:
2023-4-12 20:56
標題:
SAMA5D28
SAMA5D28 微控制器也可以使用 C 語言編寫 PLC 程序。
以下是一個示例程序,實現了讀取 ADC 輸入並將其輸出到串口:
c
#include <stdint.h>
#include "sama5d28.h"
#define UART_TX_PIN PIO_PA9A_URXD | PIO_PA10A_UTXD
#define ADC_PIN PIO_PB1X1_AD0
int main() {
// 使能 PIOA 和 PIOB 時鐘
PMC->PMC_PCER0 |= PMC_PCER0_PID10 | PMC_PCER0_PID11;
// 配置 UART0
PIOA->PIO_PDR |= UART_TX_PIN;
PIOA->PIO_ABSR |= UART_TX_PIN;
UART0->UART_CR = UART_CR_RXDIS | UART_CR_TXDIS;
uint32_t uart_clock = SystemCoreClock / 2;
uint32_t baudrate = 115200;
uint16_t cd = (uint16_t)(uart_clock / (16 * baudrate));
UART0->UART_BRGR = cd;
UART0->UART_CR = UART_CR_RXEN | UART_CR_TXEN;
// 配置 ADC
ADC->ADC_CR = ADC_CR_SWRST;
ADC->ADC_MR = ADC_MR_TRGEN | ADC_MR_TRGSEL_ADC_TRIG0 | ADC_MR_PRESCAL(7);
ADC->ADC_CHER = ADC_CHER_CH0;
ADC->ADC_IER = ADC_IER_EOC0;
NVIC_EnableIRQ(ADC_IRQn);
while (1) {
// 等待 ADC 轉換完成
while (!(ADC->ADC_ISR & ADC_ISR_EOC0));
// 讀取 ADC 值並輸出到串口
uint16_t value = ADC->ADC_CDR[0];
char buf[32];
snprintf(buf, sizeof(buf), "ADC value: %d\r\n", value);
for (int i = 0; buf[i] != '\0'; i++) {
while (!(UART0->UART_SR & UART_SR_TXRDY));
UART0->UART_THR = buf[i];
}
// 延時 500ms
for (int i = 0; i < 500000; i++) {
__NOP();
}
}
return 0;
}
void ADC_Handler() {
ADC->ADC_IDR = ADC_IDR_EOC0;
}
歡迎光臨 冰楓論壇 (https://bingfong.com/)
Powered by 冰楓