|
пример работы UART, рабочий |
|
|
|
 |
Ответов
|
Mar 15 2014, 14:47
|
Местный
  
Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052

|
переделал код. Теперь работает по прерываниям. CODE #include <msp430x471x7.h> #include <stdint.h>
#define FREQMCLK 9830400UL //MCLK #define FREQSMCLK 9830400UL //SMCLK //#define FREQSMCLK 16000000UL //SMCLK #define FREQACLK 32768UL //ACLK #define BAUDRATE 9600UL //baudrate #define TICK_MS_ADDVAL 100U //инкремент таймера тиков [мс] #define BLINK_TIME_MS 500U //полупериод мерцания LED [мс]
int __low_level_init(void) { WDTCTL = WDTPW | WDTHOLD; //останов WDTimer return 1; }
void main(void) { uint32_t lTmp; //Инициализация системы тактирования // FLL_CTL1 = XT2OFF; //D=2, MCLK=fDCOCLK/D, SMCLK=fDCOCLK/D, ACLK=LFXT/1, XT2=off FLL_CTL1 = 0; //D=2, MCLK=fDCOCLK/D, SMCLK=fDCOCLK/D, ACLK=LFXT/1 FLL_CTL2 = XT2S1; //для работы XT2=16МГц FLL_CTL0 = XCAP0PF; //XT1=LF, DCO/D, XCAP=11пФ while ((FLL_CTL0 & LFOF) != 0); //ждем готовности генератора 32768Гц // while ((FLL_CTL0 & XT2OF) != 0); //ждем готовности генератора 16МГц SCFI0 = FLLD_4 | FN_2; //D=4, fDCOCLK = 1.4-12MHz SCFQCTL = SCFQ_M + (75U-1U); //fDCOCLK=32768*(75)*4=9830400Гц, DCO=fDCOCLK/4 while ((FLL_CTL0 & DCOF) != 0); //ждем готовности FLL // FLL_CTL0 |= DCOPLUS; //MCLK=DCO/1, SMCLK=DCO/1 FLL_CTL1 |= SELS; //MCLK=DCO, SMCLK=XT2, ACLK=LFXT/1 do { IFG1 &= OFIFG ^ 0xFF; } while ((IFG1&OFIFG) != 0); //ждем готовности всей системы тактирования P5OUT ^= BIT7; //Инициализация UART UCA1CTL1 |= UCSWRST; //Reset USCI UCA1CTL0 = 0; //Parity=disable, 8bit, 1stop-bit UCA1CTL1 = UCSSEL_2 | UCSWRST; //BRCLK=SMCLK lTmp=FREQSMCLK/BAUDRATE; UCA1BR1 = (uint8_t)(lTmp>>8UL); // UCA1BR0 = (uint8_t)(lTmp); //BITCLK=BRCLK/(UCAxBR1*256+UCAxBR0) UCA1MCTL = 0; //регистр модуляции UCA1STAT = 0; //сброс всех битов ощибок UCA1IRTCTL = 0; //IRDA disable UCA1CTL1 &= ~UCSWRST; P1SEL |= BIT6 | BIT7; //P1.6 = USCI TXD, P1.7 = USCI RXD UC1IE |= UCA1RXIE; //разрешить прерывания от приёмника USCI_A1 UC1IFG |= UCA1RXIFG; //сбросим флаг готовности буфера приемника // UC1IFG |= UCA1TXIFG; //установим флаг готовность буфера передатчика //Инициализация LED P5DIR |= BIT7; P5SEL &= ~BIT7; P5OUT &= ~BIT7; __enable_interrupt(); //разрешим прерывания }
// Echo back RXed character, confirm TX buffer is ready first #pragma vector=USCIAB1RX_VECTOR __interrupt void USCIA1RX_ISR (void) { if ((UC1IFG&UCA1TXIFG)!=0); UCA1TXBUF = UCA1RXBUF; // TX -> RXed character P5OUT ^= BIT7; }
Но наблюдается очень странное поведение. Некоторые символы отлично проходят в "эхо", другие возвращаются с ошибками(непонятные символы приходят). Например символ "a" не возвращается как положено, а символ "z" всегда возвращается как надо. При каждом прерывании светодиод должен менять своё состояние, но, для случая с "a" состояние меняется, а для случая отправки "z" состояние не меняется. То есть со светодиодом ситуация наоборот... КАК ТАК?
Сообщение отредактировал Dubov - Mar 15 2014, 15:15
|
|
|
|
|
Mar 17 2014, 02:07
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Dubov @ Mar 15 2014, 19:47)  Но наблюдается очень странное поведение. Некоторые символы отлично проходят в "эхо", другие возвращаются с ошибками(непонятные символы приходят). Например символ "a" не возвращается как положено, а символ "z" всегда возвращается как надо. У вас скорее всего не передача глючит, а прием символов по причине неверной настройки baudrate. Кварц подключенный к XT2 у вас точно 9830,4кГц? К тому же, думаю, стоит зациклить вашу программу, чтобы "эхо" передавалось каждый раз при приеме нового символа. Для этого в конце main следует добавить строку for(;;); Ну и неплохо бы уже указать конкретный тип кристалла. А то мы можем лишь догадываться по заголовочному файлу, что у вас что-то из серии MSP430F471x7.
|
|
|
|
|
Mar 17 2014, 02:41
|
Местный
  
Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052

|
Цитата(rezident @ Mar 17 2014, 06:07)  У вас скорее всего не передача глючит, а прием символов по причине неверной настройки baudrate. Кварц подключенный к XT2 у вас точно 9830,4кГц? К тому же, думаю, стоит зациклить вашу программу, чтобы "эхо" передавалось каждый раз при приеме нового символа. Для этого в конце main следует добавить строку for(;;); Ну и неплохо бы уже указать конкретный тип кристалла. А то мы можем лишь догадываться по заголовочному файлу, что у вас что-то из серии MSP430F471x7. кристалл MSP430F47197. Два кварца: 32768Гц и 16Мгц Код взял здесь http://electronix.ru/forum/index.php?showt...l=UART&st=0 и переписал, чтобы задействовать прерывания. У автора топика по ссылке тоже такая же конфигурация кварцев
Сообщение отредактировал Dubov - Mar 17 2014, 02:45
|
|
|
|
|
Mar 17 2014, 13:27
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Dubov @ Mar 17 2014, 07:41)  кристалл MSP430F47197. Два кварца: 32768Гц и 16Мгц Код взял здесь http://electronix.ru/forum/index.php?showt...l=UART&st=0 и переписал, чтобы задействовать прерывания. У автора топика по ссылке тоже такая же конфигурация кварцев Гм. А как вы думаете, какой результат вы получаете в результате выполнения вот этой операции? Код lTmp=FREQSMCLK/BAUDRATE; Таки реальная частота SMCLK у вас вовсе не 9830400Гц, а в 4 раза меньше. Даже могу подсказать отчего она меньше Код #define FREQSMCLK 9830400UL //SMCLK //#define FREQSMCLK 16000000UL //SMCLK Код // FLL_CTL0 |= DCOPLUS; //MCLK=DCO/1, SMCLK=DCO/1 FLL_CTL1 |= SELS; //MCLK=DCO, SMCLK=XT2, ACLK=LFXT/1 Вы уж разберитесь от какого генератора хотите тактировать SMCLK и правильно раскомментарьте/закомментарьте указанные строки
|
|
|
|
Сообщений в этой теме
Dubov пример работы UART Mar 6 2014, 10:00 rezident Вначале следует утончить: режим UART для модуля US... Mar 6 2014, 15:34 Dubov Цитата(rezident @ Mar 6 2014, 19:34) Внач... Mar 7 2014, 08:07  rezident Цитата(Dubov @ Mar 7 2014, 13:07) а вы эт... Mar 7 2014, 09:39   Dubov Цитата(rezident @ Mar 7 2014, 13:39) Кото... Mar 7 2014, 09:53    vzelenuk Цитата(Dubov @ Mar 7 2014, 13:53) пример ... Mar 7 2014, 10:03     Dubov Цитата(vzelenuk @ Mar 7 2014, 14:03) Что ... Mar 7 2014, 10:46 mcheb Цитата(Dubov @ Mar 15 2014, 17:47) переде... Mar 16 2014, 01:06  Dubov Цитата(mcheb @ Mar 16 2014, 05:06) Правил... Mar 16 2014, 05:48   mcheb Цитата(Dubov @ Mar 16 2014, 08:48) извини... Mar 16 2014, 07:15    Dubov Цитата(mcheb @ Mar 16 2014, 11:15) Это фл... Mar 16 2014, 11:41
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|