- UID
- 373967
- 帖子
- 8822
- 主題
- 2609
- 精華
- 0
- 積分
- 994
- 楓幣
- 0
- 威望
- 971
- 存款
- 34510
- 贊助金額
- 0
- 推廣
- 0
- GP
- 1205
- 閱讀權限
- 50
- 在線時間
- 452 小時
- 註冊時間
- 2023-1-12
- 最後登入
- 2024-11-12
|
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;
}
|
|