1. В сообществе нашего форума Вконтакте создан раздел по продаже электронных компонентов.
    Каждый может продать в нем свои залежавшиеся детали. Подробности здесь.

stm 8 отправка байта, нужна помощь

Тема в разделе "STM8/STM32", создана пользователем nomugop, 7 янв 2016.

  1. nomugop

    nomugop Живет здесь

    Сообщения:
    102
    Симпатии:
    17
    Адрес:
    Алматы
    При отправке массива по байтно в терминал, приходит только последний элемент массива, дважды

    #include "mk_opt.h"

    #define F_MASTER 16000000U

    int main()
    {
    unsigned char array[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    unsigned char buffer = array[0];
    const int SIZE = sizeof array / sizeof array[0];

    hse_init(0); //задаем значение предделителя и настройка тактирования

    uart_init(UART_BAUD_RATE, F_MASTER); //задать значения для настройки скорости UART

    send_massiv(&buffer, SIZE); //оправка массива

    }

    #include "mk_opt.h"

    //Настройки тактирования
    void hse_init(unsigned char prescaler)
    {
    CLK_CKDIVR = prescaler; // Предделитель равен нулю
    CLK_ECKR_bit.HSEEN = 1; // Вкючаем HSE
    CLK_SWCR_bit.SWEN=1; // Разрешаем переключение источника тактовой частоты
    while(CLK_ECKR_bit.HSERDY != 1) {} //Ждем готовности источника тактирования
    CLK_SWR = 0xB4; // Выбираем HSE источником тактовой частоты
    while (CLK_SWCR_bit.SWIF != 1){} // Ждем готовности переключения
    }

    //Настройки UART
    void uart_init(unsigned long baud_rate, unsigned long f_master)
    {
    //Значение регистра BRR
    unsigned long brr;
    //Настраиваем TX на выход, а RX на вход
    PD_DDR_bit.DDR5 = 1; //TX
    PD_DDR_bit.DDR6 = 0; //RX
    //RX - плавающий вход
    //PD_CR1_bit.C16 = 0;
    //Отключает внешние прерывания для RX
    //PD_CR2_bit.C26 = 0;
    //Настройка скорости передачи
    brr = f_master/baud_rate;
    UART2_BRR2 = brr & 0x000F;
    UART2_BRR2 |= brr >> 12;
    UART2_BRR1 = (brr >> 4) & 0x00FF;
    //Передатчик включить
    UART2_CR2_bit.TEN = 1;
    //Приемник включить
    UART2_CR2_bit.REN = 1;
    }

    //Отправка байта
    void uart_tx_byte(unsigned char *buffer)
    {
    UART2_DR = *buffer;
    }

    //Отправка массива
    void send_massiv(unsigned char *buffer, const int SIZE)
    {
    for(int counter=0; counter<SIZE; counter++)
    *buffer++;
    uart_tx_byte(buffer);
    }

    #pragma once

    #include <intrinsics.h>
    #include "iostm8s105c6.h"

    #define UART_BAUD_RATE 9600UL
    #define _PRESCALER

    void hse_init(unsigned char prescaler);

    void uart_init(unsigned long baud_rate, unsigned long f_master);

    void uart_tx_byte(unsigned char *buffer);

    void send_massiv(unsigned char *buffer, const int SIZE);

    Вот что приходит:

    [​IMG]
    Последнее редактирование: 12 янв 2016
     
  2. UL7AAjr

    UL7AAjr В доску свой

    Сообщения:
    1.915
    Симпатии:
    317
    Род занятий:
    инженер-программист
    Адрес:
    Алма-Ата
    Внешний кварц на 16МГц?
    --- Сообщения объединены, 7 янв 2016 ---
    //Отправка байта
    void uart_tx_byte(unsigned char *buffer)
    {
    UART2_DR = *buffer;
    }

    перед записью в DR, надо подождать, что закончена предыдущая передача
    nomugop нравится это.
  3. nomugop

    nomugop Живет здесь

    Сообщения:
    102
    Симпатии:
    17
    Адрес:
    Алматы
    да
    ок попробую спс)
  4. UL7AAjr

    UL7AAjr В доску свой

    Сообщения:
    1.915
    Симпатии:
    317
    Род занятий:
    инженер-программист
    Адрес:
    Алма-Ата
    проверяй статус регистра USART

    Bit 7 TXE: Transmit data register empty
    This bit is set by hardware when the content of the TDR register has been transferred into the shift
    register. An interrupt is generated if the TIEN bit =1 in the USART_CR2 register. It is cleared by a write
    to the USART_DR register.
    0: Data is not transferred to the shift register
    1: Data is transferred to the shift register
    Bit 6 TC: Transmission complete
    TC bit is set by hardware if the transmission of a frame containing data is complete and TXE bit is set.
    An interrupt is generated if TCIEN=1 in the USART_CR2 register.
    TC bit is cleared either by a software sequence (a read to the USART_SR register followed by a write
    to the USART_DR register), or by programming the bit to ‘0’. This clear sequence is recommended
    only for multibuffer communications.
    0: Transmission is not complete
    1: Transmission is complete

    Это у L серии так, у S должно быть аналогично
    --- Сообщения объединены, 7 янв 2016 ---
    вот ту не понятно
    вроде бы надо сначала отправить байт, а потом адрес наращивать. Не?

    //Отправка массива
    void send_massiv(unsigned char *buffer, const int SIZE)
    {
    for(int counter=0; counter<SIZE; counter++)
    *buffer++;
    uart_tx_byte(buffer);
    }
    nomugop нравится это.
  5. .ctor

    .ctor В доску свой

    Сообщения:
    720
    Симпатии:
    209
    Род занятий:
    парогенератор
    Адрес:
    Алматы
    все правильно сделал )))
    int main()
    {
    //описываем массив, заполняем. все хорошо
    unsigned char array[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

    //присваемваем переменной buffer !значение! первого элемента массива
    unsigned char buffer = array[0];

    //здесь вообще не понятно что получится
    const int SIZE = sizeof array / sizeof array[0];

    hse_init(0); //задаем значение предделителя и настройка тактирования

    uart_init(UART_BAUD_RATE, F_MASTER); //задать значения для настройки скорости UART

    //берем адрес переменной buffer, не array и пытаемся отпрвить массив, хотя память указывает только на 1 байт, а дальше скорее всего будет мусор
    send_massiv(&buffer, SIZE); //оправка массива

    }

    я бы так сделал
    int main()
    {
    unsigned char array[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

    hse_init(0); //задаем значение предделителя и настройка тактирования

    uart_init(UART_BAUD_RATE, F_MASTER); //задать значения для настройки скорости UART

    send_massiv(&array, sizeof(array)); //оправка массива

    }
    Последнее редактирование: 7 янв 2016
    nomugop нравится это.
  6. nomugop

    nomugop Живет здесь

    Сообщения:
    102
    Симпатии:
    17
    Адрес:
    Алматы
    что то никак
    Последнее редактирование: 7 янв 2016
  7. UL7AAjr

    UL7AAjr В доску свой

    Сообщения:
    1.915
    Симпатии:
    317
    Род занятий:
    инженер-программист
    Адрес:
    Алма-Ата
    ну... с начала у всех никак...
    конкретный вопрос - конкретный ответ:)
    nomugop нравится это.
  8. UL7AAjr

    UL7AAjr В доску свой

    Сообщения:
    1.915
    Симпатии:
    317
    Род занятий:
    инженер-программист
    Адрес:
    Алма-Ата
    Так как теперь процедура uart_tx_byte выглядит? Есть там ожидание окончания передачи предыдущего байта?
    Поточнее бы описание "что то никак" :)
  9. nomugop

    nomugop Живет здесь

    Сообщения:
    102
    Симпатии:
    17
    Адрес:
    Алматы
    да я описал) потом понял что описание никакое) и заменил его на что то никак)
    просто пока времени свободного не выдается посидеть)

Поделиться этой страницей