C++ SAM4SxPLAINED上的UART
SAM4SxPLAINED上的UART 你好, 我有一个(几乎)有效的程序 这些角色被传送了,但它们仍然不是人们所希望的。 谁能纠正 谢谢你所做的一切 你好 Voici le代码:C++ SAM4SxPLAINED上的UART,c++,signals,uart,atmel,C++,Signals,Uart,Atmel,SAM4SxPLAINED上的UART 你好, 我有一个(几乎)有效的程序 这些角色被传送了,但它们仍然不是人们所希望的。 谁能纠正 谢谢你所做的一切 你好 Voici le代码: #include "sam.h" // Fréquence d'horloge #define MCLK CHIP_FREQ_MAINCK_RC_4MHZ // Configure UART #define BAUD 115200 #define PARITY UART_MR_PAR_NO //#defi
#include "sam.h"
// Fréquence d'horloge
#define MCLK CHIP_FREQ_MAINCK_RC_4MHZ
// Configure UART
#define BAUD 115200
#define PARITY UART_MR_PAR_NO
//#define PARITY UART_MR_PAR_EVEN
// Définitions pour PA9 comme RX_UART0 et PA10 comme TX_UART0 (Périphérique A).
#define RXTX_PIO PIOA
#define RX_PIN PIO_PA9
#define TX_PIN PIO_PA10
#define UART UART0
#define UART_PID ID_UART0
#define RXTX_IRQn PIOA_IRQn
#define UART_IRQn UART0_IRQn
//prototype pour les fonctions. On ne veut pas faire un .h pour ça !
void hardware_init( void ) ;
void hardware_init( void )
{
//pour utiliser RX_UART et TX_UART.
PMC->PMC_PCER0 = (1 << UART_PID) ;
RXTX_PIO->PIO_IDR |= RX_PIN | TX_PIN ;
// Sélectionne le périphérique A
RXTX_PIO->PIO_ABCDSR[0] &= ~(RX_PIN | TX_PIN) ;
RXTX_PIO->PIO_ABCDSR[1] &= ~(RX_PIN | TX_PIN) ;
RXTX_PIO->PIO_PDR = (RX_PIN | TX_PIN) ;
//Configure UART
UART->UART_BRGR= MCLK / (BAUD * 16) ;
UART->UART_CR = UART_CR_TXEN | UART_CR_RXEN ;
UART->UART_IER = UART_IER_RXRDY ;
// Active les interruptions sur UART;
NVIC_EnableIRQ( UART_IRQn ) ;
// Configure Systick pour un déclenchement chaque milliseconde
SysTick_Config( SystemCoreClock/1000UL ) ;
NVIC_EnableIRQ( SysTick_IRQn ) ;
}
// Variable globale pour compter les tics
static uint32_t ul_tickcount=0 ;
// Variable globale pour UART_Handler
static int32_t tr ;
static uint32_t j = 0 ;
static char chaine[] = "Bonjour UART0 " ;
static uint8_t nb_car = 14 ; //nombre de caractères de chaine
void SysTick_Handler( void )
{
ul_tickcount++ ;
// envoie un caractère toutes les secondes (ie 1000ms)
if ( ul_tickcount == 1000)
{
if (j == nb_car)
{
j=0;
}
while(!(UART->UART_SR & UART_SR_TXRDY)) ;
UART->UART_THR = chaine[j] ;
j++ ;
ul_tickcount = 0 ;
}
}
void UART0_Handler( void )
{
if (UART->UART_SR & UART_SR_RXRDY)
{
tr = UART->UART_RHR ;
while(!(UART->UART_SR & UART_SR_TXRDY));
UART->UART_THR = tr - 1 ;
}
}
int main (void)
{
hardware_init() ;
while ( 1 )
{
}
}
#包括“sam.h”
//钟表顺序
#定义MCLK芯片\u频率\u主控\u RC\u 4MHZ
//配置UART
#定义波特率115200
#定义奇偶校验UART\U MR\U PAR\U NO
//#定义奇偶校验UART\u MR\u PAR\u偶数
//对PA9通信接收和PA10通信发送的定义(Périphérique A)。
#定义RXTX_PIO PIOA
#定义RX_引脚PIO_PA9
#定义TX_引脚PIO_PA10
#定义UART UART0
#定义UART\u PID ID\u UART0
#定义RXTX_IRQn PIOA_IRQn
#定义UART_IRQn UART0_IRQn
//原型机倒咖啡。在一个美丽的世界里!
无效硬件初始化(无效);
无效硬件初始化(无效)
{
//倾倒利用器RX_UART和TX_UART。
PMC->PMC|PCER0=(1个PIO|U IDR |=RX|U引脚| TX|U引脚;
//佩里佩里克酒店
RXTX_PIO->PIO_ABCDSR[0]&=~(RX_引脚| TX_引脚);
RXTX_PIO->PIO_ABCDSR[1]&=~(RX_引脚| TX_引脚);
RXTX_PIO->PIO_PDR=(RX_引脚| TX_引脚);
//配置UART
UART->UART_BRGR=MCLK/(波特率*16);
UART->UART\u CR=UART\u CR\u TXEN | UART\u CR\u RXEN;
UART->UART\u IER=UART\u IER\u RXRDY;
//UART上的主动les中断;
NVIC_EnableIRQ(UART_IRQn);
//配置Systick PUR un déCLENCHENCE chaque毫秒
系统时钟配置(系统时钟/1000UL);
NVIC_EnableIRQ(SysTick_IRQn);
}
//可变全局浇注计算机
静态uint32_t ul_tickcount=0;
//变量globale-pour-UART\u处理程序
静态int32_t tr;
静态uint32_t j=0;
静态字符链[]=“你好,UART0”;
静态uint8_t nb_car=14;//nombre de caractères de chaine
void SysTick_处理器(void)
{
ul_tickcount++;
//第二次会议(即1000毫秒)
如果(ul_tickcount==1000)
{
如果(j==nb_车)
{
j=0;
}
而(!(UART->UART_SR&UART_SR_TXRDY));
UART->UART_THR=chaine[j];
j++;
ul_tickcount=0;
}
}
无效UART0_处理器(无效)
{
如果(UART->UART\U SR和UART\U SR\U RXRDY)
{
tr=UART->UART\U RHR;
而(!(UART->UART_SR&UART_SR_TXRDY));
UART->UART_THR=tr-1;
}
}
内部主(空)
{
硬件初始化();
而(1)
{
}
}
您是否正确地将波特率与输出终端同步?是的。我在Atmel Studio 6.2或Tera术语中使用了“windows终端”,结果相同。您定义了波特率和奇偶校验率,但我无法确定您实际使用它初始化UART的位置。UART->UART\u BRGR=MCLK/(波特率*16);而且,如果我加上UART->UARTõu MR=PARITY,那就更糟糕了:Boîjoõr UAÒT0 Boîjor UART0 Boîjour UART0 Boîjour UART0 BoÒjour UART0 Bo jour UART0 Boîjour UART0 Boîjour UART0是输出的一个样本。一个好的对许多人都是错的。