Hi all,
i have to do this operation for write a pixel value on a LCD, i'm tring to do this faster.
I want to change this command:
tmp_pixel = (buff[pointer] << 8) | buff[pointer+1];//elaboro i dati letti convertendoli in 16bit
with:
BME_BITFIELD_INSERT(&tmp_pixel, 8, 7) = buff[pointer];
BME_BITFIELD_INSERT(&tmp_pixel, 0, 7) = buff[pointer+1];
but every time i have an error PE_ISR(Cpu_Interrupt)
the macro is this:
/******************************************************************************
* macro used to generate hardcoded bit field insert address (BFI).
*
*******************************************************************************/
/*****************************************************************************//*!
*
* @brief generates BME bitfield insert operation addresss (hardcoded 32-bit address).
*
* @param[in] ADDR 32-bit address.
* @param[in] bit bit number, 0-based.
* @param[in] width bitfield width, 1-based.
*
* @return hardcoded 32-bit address.
*
* @ Pass/ Fail criteria: none.
*
*****************************************************************************/
#define BME_BITFIELD_INSERT(ADDR,bit,width) (*(volatile uint32_t *)(((uint32_t)ADDR) \
| (BME_OPCODE_BITFIELD <<26) \
| ((bit)<<23) | ((width-1))<<19))
Thanks
Solved! Go to Solution.
Hi Daniele Cortellazzi,
thank you for the code. I have to apologize to you. I made you confused.
Regarding BME_BITFIELD_INSERT, the case that subtract 0xF0000 is only for GPIO. For the other peripherals of which start address is 0x40000000 case, your original macro was valid.
By the way, now I must say sad information. I checked again the Reference Manuals and have found almost all KL devices don't support BFI operation for SRAM_U. They support it only for the peripherals (i.e. address is from 0x40000000). If you want to use BFI for SRAM_U, you should adopt KL03.
Best regards,
Yasuhiko Koumoto.
Hi,
no this didn't solve the problem ....
Hi Daniele Cortellazzi,
is the tmp_pixel located in the GPIO address area? If it is so, the BME macro would be useless. It is why the bit 19 of the GPIO address will collide into the BME setting. You should use the BME alias area of GPIO. That is, from 0x400FF000 to 0x400FFFFF should be converted to from 0x4000F000 to 0x4000FFFF. Probably you might change the macro as the following.
#define BME_BITFIELD_INSERT(ADDR,bit,width) (*(volatile uint32_t *)(((uint32_t)ADDR-0xF0000) \
| (BME_OPCODE_BITFIELD <<26) \
| ((bit)<<23) | ((width-1))<<19))
Does this help you?
Best regards,
Yasuhiko Koumoto.
Thanks for the support.
No this didn't solve the problem. I will no use the BME for the moment, i haven't time to undestand the problem now. Thanks
Hi Daniele Cortellazzi ,
can you let me know the tmp_pixel address for my future learning?
Best regards,
Yasuhiko Koumoto.
Sure,
tmp_pixel is define as unsigned short tmp_pixel = 0; and in my code his address is 0x2003270
Best regards
Hi,
thank you but it is 0x20003270, isn't it?
Best regards,
Yasuhiko Koumoto.
Yes, my error. Is 0x20003270.
I'm sorry. May I ask one more question. Is BME_OPCODE_BITFIELD 4? If it is so, I have no further comments.
Best regards,
Yasuhiko Koumoto.
Hi Daniele Cortellazzi,
thank you for the code. I have to apologize to you. I made you confused.
Regarding BME_BITFIELD_INSERT, the case that subtract 0xF0000 is only for GPIO. For the other peripherals of which start address is 0x40000000 case, your original macro was valid.
By the way, now I must say sad information. I checked again the Reference Manuals and have found almost all KL devices don't support BFI operation for SRAM_U. They support it only for the peripherals (i.e. address is from 0x40000000). If you want to use BFI for SRAM_U, you should adopt KL03.
Best regards,
Yasuhiko Koumoto.
Thanks for the information.
Hi Daniele,
although I don't know why the error happens, at least you should shift assigning value by the bit position.
[before]
BME_BITFIELD_INSERT(&tmp_pixel, 8, 7) = buff[pointer];
BME_BITFIELD_INSERT(&tmp_pixel, 0, 7) = buff[pointer+1];
[after]
BME_BITFIELD_INSERT(&tmp_pixel, 8, 7) = buff[pointer]<<8;
BME_BITFIELD_INSERT(&tmp_pixel, 0, 7) = buff[pointer+1]<<0;
I think BME would not help speed up because it initiates read-modify-write for the tmp_pixel internally.
tmp_pixel = (buff[pointer] << 8) | buff[pointer+1];
would result in one write for the tmp_pixel.
I think you are using a Cortex-M0+ device because you use BME. If it is correct, you'd better use FGPIO (Fast GPIO) which is mapped on the alias area of the normal GPIO if the tmp_pixel is located on the GPIO area.
Best regards,
Yasuhiko Koumoto.