Копаю интернет, но все как-то безуспешно.
Хочу написать функцию передачи строки по UART, работающую по прерыванию. Причем строка может быть как константа (храниться во флэш), так и переменная (храниться в СОЗУ).
Код
#define size_TX0 10
volatile static int8_t count_TX0;//кол-во непереданных символов в буфере UART0
volatile static int8_t index_TX0;//адресация в буфере передачи UART0
volatile static int8_t bufferTX0[size_TX0];//массив - буфер передачи UART0
/*==============================*/
void send_UART0(char *string)
{
int8_t i;
for(i=0;*string!='\0';i++)
{
bufferTX0[i]=(*string); //сохраняем строку в буфер
string++;
count_TX0++; //считаем символы
}
index_TX0=0; //обнуляем адресацию в буфере
sbi(UCSR0B,UDRIE0); //запускаем прерывание
}
/*==============================*/
ISR(USART0_UDRE_vect)
{
UDR0 = bufferTX0[index_TX0++]; // Берем данные из буффера.
if(index_TX0==count_TX0) cbi(UCSR0B,UDRIE0); // Если все передали, то выкл.прерывание
}
/*==============================*/
volatile static int8_t count_TX0;//кол-во непереданных символов в буфере UART0
volatile static int8_t index_TX0;//адресация в буфере передачи UART0
volatile static int8_t bufferTX0[size_TX0];//массив - буфер передачи UART0
/*==============================*/
void send_UART0(char *string)
{
int8_t i;
for(i=0;*string!='\0';i++)
{
bufferTX0[i]=(*string); //сохраняем строку в буфер
string++;
count_TX0++; //считаем символы
}
index_TX0=0; //обнуляем адресацию в буфере
sbi(UCSR0B,UDRIE0); //запускаем прерывание
}
/*==============================*/
ISR(USART0_UDRE_vect)
{
UDR0 = bufferTX0[index_TX0++]; // Берем данные из буффера.
if(index_TX0==count_TX0) cbi(UCSR0B,UDRIE0); // Если все передали, то выкл.прерывание
}
/*==============================*/
Пишу send_UART0("12345");, но эти 12345 сохраняются в СОЗУ.
Вопрос: как передать в функцию строку, чтобы она сохранилась во флэш?
Спасибо.